2009-12-15 7 views
0

다음과 같은 문제점이 있습니다. 각 세션 데이터가 세션 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 - 설명자에 대한 작업

답변

1

이 기능을 사용하지 않습니까?

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 실패 (파일 이름이 존재하지 않음) 또는 현재 파일을 열었던 하나, 보석 같은 아니라는 것을 보여줍니다.

+0

나는 이것이 작동해야한다고 생각합니다! 고마워, 이것은 defenatly 경로와 fd를 연결합니다. – Artyom

관련 문제