개발/리눅스

I NOTIFY

-=HaeJuK=- 2024. 5. 21. 10:56

INOTIFY는 리눅스 커널의 파일 시스템 이벤트 모니터링 메커니즘으로, 파일 시스템 내의 변경 사항을 감시하고 사용자 공간 애플리케이션에 알림을 제공합니다. INOTIFY는 특히 파일과 디렉토리의 수정, 생성, 삭제 등의 이벤트를 모니터링하는 데 유용합니다. 시스템 관리자와 개발자에게 파일 시스템 활동을 추적하고 이에 따라 적절한 조치를 취할 수 있는 방법을 제공합니다.

다음은 INOTIFY에 대한 주요 기능과 세부 사항입니다:

  1. 파일 및 디렉토리 모니터링: INOTIFY는 특정 파일이나 디렉토리에서 발생하는 이벤트를 모니터링할 수 있습니다. 이를 통해 파일 시스템의 변경 사항을 실시간으로 감시할 수 있습니다.
  2. 이벤트 유형: INOTIFY는 파일 또는 디렉토리의 생성, 삭제, 수정, 이동 등의 다양한 이벤트를 감지할 수 있습니다.
  3. 효율성: INOTIFY는 파일 시스템 이벤트를 효율적으로 감지하고 처리할 수 있는 메커니즘을 제공합니다. 이는 폴링(polling) 방식보다 효율적이며 시스템 리소스를 절약할 수 있습니다.
  4. 사용자 공간 인터페이스: INOTIFY는 사용자 공간 애플리케이션에 인터페이스를 제공하여 이벤트를 등록하고 처리할 수 있게 합니다. 이를 통해 애플리케이션은 파일 시스템 이벤트에 대한 실시간 대응이 가능합니다.

예제 사용 사례

  • 파일 동기화 도구: 파일 시스템의 변경 사항을 감지하여 변경된 파일을 동기화합니다.
  • 로그 모니터링: 로그 파일의 변경 사항을 실시간으로 감시하여 로그 업데이트를 즉시 처리합니다.
  • 보안: 중요 파일의 변경 사항을 모니터링하여 무단 수정이나 삭제를 감지합니다.
  • 백업 시스템: 파일 변경 사항을 감지하여 변경된 파일만 백업합니다.

기본 사용법

INOTIFY를 프로그램에서 사용하려면 일반적으로 다음 단계를 수행합니다:

  1. INOTIFY 초기화: inotify_init() 또는 inotify_init1()을 사용하여 새로운 INOTIFY 인스턴스를 생성합니다.
  2. 워치 추가: inotify_add_watch()을 사용하여 모니터링할 파일이나 디렉토리와 이벤트를 지정합니다.
  3. 이벤트 읽기: read()를 사용하여 INOTIFY 파일 디스크립터에서 이벤트를 가져옵니다.
  4. 이벤트 처리: 애플리케이션에서 필요한 대로 이벤트를 처리합니다.

예제 코드

#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>
#include <unistd.h>
#include <limits.h>

int main() {
    int inotify_fd, watch_fd;
    char buffer[4096]
        __attribute__ ((aligned(__alignof__(struct inotify_event))));
    ssize_t length;
    char *ptr;

    // INOTIFY 초기화
    inotify_fd = inotify_init();
    if (inotify_fd == -1) {
        perror("inotify_init");
        exit(EXIT_FAILURE);
    }

    // 워치 추가
    watch_fd = inotify_add_watch(inotify_fd, "/path/to/monitor", IN_CREATE | IN_DELETE | IN_MODIFY);
    if (watch_fd == -1) {
        perror("inotify_add_watch");
        exit(EXIT_FAILURE);
    }

    // 이벤트 읽기 및 처리
    while (1) {
        length = read(inotify_fd, buffer, sizeof(buffer));
        if (length == -1 && errno != EAGAIN) {
            perror("read");
            exit(EXIT_FAILURE);
        }

        for (ptr = buffer; ptr < buffer + length; ) {
            struct inotify_event *event = (struct inotify_event *) ptr;

            if (event->mask & IN_CREATE) {
                printf("File %s was created.\n", event->name);
            }
            if (event->mask & IN_DELETE) {
                printf("File %s was deleted.\n", event->name);
            }
            if (event->mask & IN_MODIFY) {
                printf("File %s was modified.\n", event->name);
            }

            ptr += sizeof(struct inotify_event) + event->len;
        }
    }

    // 정리
    close(inotify_fd);
    return 0;
}

이 코드는 INOTIFY를 초기화하고 특정 이벤트를 모니터링할 워치를 추가한 다음, 이벤트를 처리하는 루프로 들어갑니다. 실제 애플리케이션에서는 적절한 이벤트 처리 및 정리 코드를 추가해야 합니다.

반응형