ext3 fs에서 일반 파일을 통해 통신하는 리더와 라이터라는 두 가지 프로세스를 상상해보십시오. 리더는 IN_MODIFY
파일에 대한 무결점 감시 기능을 가지고 있습니다. Writer는 한 번의 write()
호출로 파일에 1000 바이트를 씁니다 . Reader는 inotify 이벤트 fstat
를 받고 파일을 호출 합니다. 리더는 무엇을 봅니까?
Reader가
st_size
파일 에서 최소 1000을 되 찾을 것이라는 보장이 있습니까? 내 실험에서 그렇지 않은 것 같습니다.Reader가 실제로
read()
1000 바이트를 보장 할 수 있습니까?
이것은 심각한 I / O 바운드 박스에서 발생합니다. 예를 들어, sar
약 1 초의 대기 시간을 보여줍니다. 제 경우에는 독자가 호출하기 전에 inotify 이벤트를 stat
받고 너무 작은 결과를 얻은 후 실제로 10 초를 기다리고 있습니다.
내가 바랐던 것은 파일이 준비 될 때까지 inotify 이벤트가 전달되지 않기를 바랐습니다. 실제로 발생하는 것으로 의심되는 것은 write()
라이터 의 호출 중에 inotify 이벤트가 발생하고 준비가 될 때마다 시스템의 다른 프로세스에서 실제로 데이터를 사용할 수 있다는 것입니다. 이 경우 10 초이면 충분하지 않습니다.
커널이 실제로 내가 추측하는 방식으로 inotify를 구현하고 있는지 확인하려고합니다. 또한이 동작을 변경할 수있는 옵션이 있다면?
마지막으로,이 행동을 고려할 때, 무결점의 요점은 무엇입니까? 어쨌든 이벤트가 발생한 후 데이터를 실제로 사용할 수있을 때까지 파일 / 디렉토리를 폴링하는 횟수가 줄어 듭니다. 뿐만 아니라 그 모든 일을하고, inotify에 대해 잊어 버릴 수 있습니다.
*** 편집하다 ** * * 자주 발생하는 것처럼 내가보고있는 행동은 실제로 의미가 있습니다. ^ _ ^
실제로 파일이있는 디렉토리의 IN_CREATE 이벤트에 응답하고 있습니다. 따라서 실제로 파일 생성에 대한 응답으로 파일을 stat ()하고 있습니다 .IN_MODIFY 이벤트는 아니지만 나중에 도착할 수 있습니다.
IN_CREATE 이벤트를 받으면 파일 자체에서 IN_MODIFY를 구독하고 IN_MODIFY 이벤트를받을 때까지 실제로 파일을 읽으려고 시도하지 않도록 코드를 변경하려고합니다. 파일에 쓰기를 놓칠 수있는 작은 창이 있다는 것을 알고 있지만 최악의 경우 파일이 최대 초 후에 닫히기 때문에 응용 프로그램에 적합합니다.