핵심 아키텍처: 감시 인스턴스와 파일 디스크립터의 분리
Inotify API의 가장 핵심적인 설계 원칙은 감시(watch)를 열린 파일(open file)이 아닌 inotify 장치에 연결하는 것입니다. 이는 dnotify의 치명적 결함을 해결합니다. dnotify에서는 파일을 열린 상태로 유지해야 감시할 수 있었는데, 이로 인해 파일뿐 아니라 마운트 지점까지 메모리에 고정되어 이동식 매체가 언마운트될 수 없었습니다. Inotify는 하나의 파일 디스크립터로 다수의 감시를 추가할 수 있으므로, 애플리케이션은 inotify_init()을 단 한 번 호출하고 필요한 만큼의 감시를 등록할 수 있습니다.
이벤트 구조와 이벤트 큐의 순서 보증
inotify_event 구조체는 wd(감시 디스크립터), mask(이벤트 유형), cookie(관련 이벤트 연결), len과 name(파일명)으로 구성됩니다. 특히 cookie는 파일 이동 시 IN_MOVED_FROM과 IN_MOVED_TO 이벤트를 연결하는 데 사용되며, 같은 cookie 값을 가진 두 이벤트는 관련 있는 작업임을 나타냅니다. inotify 파일 디스크립터에서 읽은 이벤트들은 정렬된 큐를 이루므로, 디렉토리 간 파일 이동 시에도 이벤트 순서가 보장됩니다.
실무 주의점: 이벤트 병합과 오버플로우 처리
동일한 파일에서 연속으로 발생한 동일한 이벤트(wd, mask, cookie, name이 모두 같음)는 아직 읽지 않은 상태에서 자동으로 병합되어 커널 메모리를 절감합니다. 그러나 이는 이벤트 개수를 신뢰성 있게 집계할 수 없음을 의미합니다. /proc/sys/fs/inotify/max_queued_events(기본값 16,384)를 초과하면 IN_Q_OVERFLOW 이벤트가 발생하므로, 대규모 감시 환경에서는 FIONREAD ioctl()로 큐 크기를 모니터링하여 처리 속도를 조절해야 합니다.