r/w 잠금 장치 및 inkink
-
19-09-2019 - |
문제
다음과 같은 문제가 있습니다. 각 세션 데이터가 세션 ID와 함께 이름이 지정된 간단한 파일로 저장되는 파일 시스템 기반 세션 스토리지를 만들고 싶습니다.
API를 따르고 싶습니다 : write(sid,data,timeout)
, read(sid,data,timeout)
, remove(sid)
Sid == 파일 이름도 모든 시간이 정해진 세션을 제거 할 수있는 일종의 GC를 원합니다.
단일 프로세스에서 작업하지만 여러 프로세스 또는 NFS에서 작업 할 때 절대적으로 사소하지 않은 경우 아주 간단한 작업.
내가 생각한 가장 간단한 해결책은 다음과 같습니다.
write/read:
fd=open(file_name,O_CREAT | O_RDWR); // create a new file or use exsting
fcntl_lock_file(fd)
save data to fd/read data from fd
fcntl_unlock_file(fd)
close(fd)
GC:
fd=open(file_name,O_RDWR);
fcntl_lock_file(fd)
if(timed_out)
unlink(file_name)
fcntl_unlock_file(fd)
close(fd)
파일을 intinking이 파일 이름과 파일 잠금 장치에서 작동하는 가장 큰 문제는 파일 설명자에서 작동합니다. 따라서 위는 다음 시나리오에서 작동하지 않습니다.
GC - open,
write - open
GC - lock, unlink, unlock, close // file still exists because held by write
write - lock, write, unlock, close // file removed
그러한 문제가 어떻게 해결 될 수 있는지 아이디어가 있습니까? 결합 파일 잠금 및 파일 제거를 허용하거나 파일 원자에서 조작 할 수있는 트릭이 있습니까?
메모:
- 데이터베이스를 사용하고 싶지 않습니다.
- 유닉스 솔루션을 찾습니다
- 솔루션은 FCNL, Open, Close, Unlink와 같은 표준 POSIX 호출과 함께 작동해야합니다.
감사.
개간 주요 문제는 파일 디스크립터의 작동을 통해 파일 (이름 -NINCE)에서의 작업 (이름 -NIMES -NUNCING)에서 원자 적으로 수행해야한다는 것입니다.
- 열고, 무제한 - 파일에서 작업하십시오
- fnctl- 설명자 작업
해결책
이 일이 작동하지 않습니까?
write/read:
fd=open(file_name,O_CREAT | O_RDWR); // create a new file or use exsting
fcntl_lock_file(fd)
if stat(file_name).{st_dev, st_ino} != fstat(fd).{st_dev, st_ino}
unlock, close, retry
save data to fd/read data from fd
fcntl_unlock_file(fd)
close(fd)
만약에 stat
eexist가 실패하거나 (파일 이름이 존재하지 않음) 현재 파일이 열린 파일과 동일하지 않음을 보여줍니다.
제휴하지 않습니다 StackOverflow