2011-08-23 4 views
2

디렉토리의 모든 파일에 대해 일부 명령을 호출하고 해당 디렉토리에서 생성 된 모든 파일에서 해당 명령을 호출하도록 감시를 설정한다고 가정합니다. 내가하는 경우 :readdir/inotify를 사용하여이 경쟁 조건을 피하는 방법은 무엇입니까?

 
while((sdi = readdir(d)) != NULL) { ... } 
closedir(d); 
/* Files created here will be missed */ 
inotify_add_watch(...); 

일부 파일이 누락 될 수 있습니다. readdir() 전에 inotify_add_watch()를 호출하면 파일이 두 번 실행될 수 있습니다 (두 번 연기하는 것을 막기 위해 인프라가 필요하며 가장자리 케이스는 처리하기 어려울 것 같습니다). readdir 루프 중에 작업 한 모든 파일의 이름을 기록하지 않아야하고 을 inotify_event 구조체에서 반환 된 이름과 비교하는 간단한 방법이 있습니까? 나는 에 필요한 비교의 양을 최소화 할 수 있습니다 : 아무것도하지 않습니다

 
while((sdi = readdir(d)) != NULL) { ... } 
inotify_add_watch(...); 
while((sdi = readdir(d)) != NULL) { /* record name */ ... } 
closedir(d); 

그리고 일반적으로 두 번째가 readdir() 루프를하지만,이 나쁜 해킹 같은 느낌.

답변

1

간단히 할 수 없습니다. 해킹이 많을수록 경쟁 조건이 높아집니다.

해결책은 실제로 을 사용하기 전에 시계를 설정하고 이미 사용 된 이름 (또는 해시)의 목록 (세트)을 유지하는 것입니다.

그러나 이것 역시 완벽하지 않습니다. 사용자는 텍스트 편집기에서 파일을 열 수 있습니다. 당신이 그것을 고쳐, 사용자가 그것을 저장하고 디렉토리는 어쨌든, 귀하의 목록에있어 고정되지 않은 파일을 포함하고 있습니다.

가장 좋은 방법은 프로그램에서 실제로 사용 된 파일을 콘텐츠로 구분할 수있게하는 것입니다. 즉, readdir() 결과에서 watch, call 명령을 설정 한 다음 inotify 결과에서 호출하고 명령 자체에서 파일이 이미 괜찮은지 여부를 알릴 수 있습니다.