다음과 같은 문제점이 있습니다. 각 세션 데이터가 세션 ID로 명명 된 간단한 파일에 저장되는 파일 시스템 기반 세션 저장소를 만들고 싶습니다.파일 r/w 잠금 및 연결 해제
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)
파일 링크 해제 파일 이름 및 파일 잠금에 작동하는 가장 큰 문제는 파일 기술자에서 작동합니다. 위 시나리오는 다음 시나리오에서 작동하지 않습니다.
GC - open,
write - open
GC - lock, unlink, unlock, close // file still exists because held by write
write - lock, write, unlock, close // file removed
아무도 이러한 문제가 해결 될 수있는 아이디어가 있습니까? 이 파일 잠금과 파일 제거를 결합하거나 파일 원자에서 작업을 수행 할 수있는 트릭이 있습니까?
주 :
- 나는 데이터베이스를 사용하지 않을, 내가
- 솔루션 POSIX는 fcnl 열고, 닫고, 같은 호출 표준 작업을해야 유닉스 에 대한 해결책을 찾아
- , 연결 해제
감사합니다. 파일 기술자의 조작에 원자 적으로 수행해야합니다 -
Clearification 주요 문제는 파일 (링크 해제 이름) -에 그 작업입니다 잠금 :
- 공개, 해제 - 파일 을 작업을
- fnctl - 설명자에 대한 작업
나는 이것이 작동해야한다고 생각합니다! 고마워, 이것은 defenatly 경로와 fd를 연결합니다. – Artyom