inotify는 write_close 이벤트를 잃지 않고 새 파일 쓰기를 감지합니다.

inotify는 write_close 이벤트를 잃지 않고 새 파일 쓰기를 감지합니다.

디렉토리의 프로세스에 의해 생성되고 작성된 파일을 보고 싶습니다. inotifywait도구 에 액세스할 수 없으므로 Inotify 라이브러리 호출만 사용합니다. 먼저 IN_CREATE파일이 생성되었는지 모니터링합니다. 관심 있는 파일이 생성되면 CLOSE_WRITE모니터링할 이벤트를 추가하겠습니다. 이 구성표는 내 핸들러가 이벤트를 처리할 때 파일이 이미 작성되어 닫혀서 IN_CREATE해당 쓰기 이벤트를 놓친다는 점을 제외하면 작동합니다.

이 상황을 해결하는 가장 좋은 방법은 무엇입니까? stat을 사용하는 기능을 사용 하려고 하는데 atim, mtim문제가 있는지는 잘 모르겠습니다. 예를 들어, 현재 타임스탬프가 st_ctim보다 큰지, st_ctim이 st_atim보다 큰지 확인할 계획입니다. 이 두 가지 조건은 현재 시간 이전에 파일 상태가 변경(액세스 및 수정)되었음을 나타냅니다.

답변1

첫째, "관심 있는 파일이 생성되면 모니터링할 CLOSE_WRITE 이벤트를 입력합니다."라는 말이 무슨 뜻인지 잘 모르겠습니다.

서로 전환 IN_CREATE하지 않고도 동일한 설문조사에서 모니터링할 수 있습니다 . IN_CLOSE_WRITE이벤트가 발생하면 inotify_eventinotify 핸들러(에서 반환 inotify_init())에서 구조를 읽을 수 있으며 해당 필드는 mask실제로 어떤 이벤트가 발생했는지 알려줍니다.

둘째, inotify 이벤트가 누락될 가능성이 있습니다. 문서에 명확하게 명시되어 있습니다. 가능한 문제의 전체 목록은 의 "제한 사항 및 경고" 제목 아래에 나열되어 있습니다 inotify(7).

"큐 오버플로" 상황이 발생한 것 같습니다. 예, 이것은 실제 상황이며 사용량이 많은 시스템에서 자주 발생합니다. 안타깝게도 이는 수정이 불가능합니다. 그냥 해결하세요. 이를 해결하는 방법은 여러 가지가 있지만 필요한 것이 무엇인지 더 잘 이해하지 못하면 더 구체적으로 설명할 수 없습니다.

일반적으로 업데이트 후 즉시 업데이트된 파일을 보려면 scandir()파일별로 정렬하거나 파일 디렉터리를 필터링하면 됩니다 mtime. 이 경우 inotify는 "디렉토리에서 발생한 문제" 깨우기 호출 역할을 하며, 수신되면 모든 업데이트를 확인하는 장기 실행 프로세스에 들어갑니다. 다 끝나면 침대에서 자세요 poll(). 이 경우 poll()한 이벤트의 끝과 다음 이벤트의 시작 사이에 발생하는 이벤트를 무시합니다. 하지만 모든 업데이트를 일괄적으로 받게 됩니다.

관련 정보