문제

다음과 같은 문제가 있습니다. 각 세션 데이터가 세션 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가 실패하거나 (파일 이름이 존재하지 않음) 현재 파일이 열린 파일과 동일하지 않음을 보여줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top