개발/리눅스

D NOTIFY

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

dnotify는 리눅스 커널 2.4에서 도입된 파일 시스템 이벤트 모니터링 메커니즘으로, 특정 디렉토리에서 발생하는 파일 시스템 이벤트를 감지할 수 있습니다. dnotify는 이후 더 발전된 inotify와 fanotify로 대체되었지만, 여전히 역사적인 이해를 위해 중요한 개념입니다.

주요 특징

  1. 디렉토리 전용: dnotify는 디렉토리에서 발생하는 이벤트만 모니터링할 수 있습니다. 파일 자체에 대한 모니터링은 지원하지 않습니다.
  2. fcntl 기반: dnotify는 파일 디스크립터와 fcntl 시스템 호출을 사용하여 이벤트를 설정합니다.
  3. 프로세스 전용 알림: 알림은 설정된 프로세스에만 전달됩니다. 이는 다수의 프로세스가 동일한 이벤트를 모니터링해야 할 경우 비효율적일 수 있습니다.
  4. 비효율성: 각 디렉토리마다 파일 디스크립터를 유지해야 하므로, 많은 디렉토리를 모니터링하는 데 비효율적입니다.
  5. 유지 보수 종료: dnotify는 더 이상 적극적으로 유지 보수되거나 발전되지 않으며, 대신 inotify와 fanotify가 권장됩니다.

사용법

dnotify를 사용하려면 fcntl 시스템 호출을 사용하여 특정 디렉토리에서 발생하는 이벤트를 모니터링할 수 있습니다. 아래는 dnotify를 사용하는 간단한 예제 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>

void handle_event(int fd) {
    printf("Directory modified\n");
}

int main() {
    int fd;
    char *dir_path = "/path/to/monitor";

    // 디렉토리 열기
    fd = open(dir_path, O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    // dnotify 설정
    if (fcntl(fd, F_NOTIFY, DN_MODIFY | DN_CREATE | DN_DELETE) == -1) {
        perror("fcntl");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 이벤트 루프
    while (1) {
        pause();  // 이벤트 대기
        handle_event(fd);
    }

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

코드 설명

 

  1. 디렉토리 열기: open() 함수를 사용하여 모니터링할 디렉토리를 엽니다.
  2. dnotify 설정: fcntl() 함수를 사용하여 F_NOTIFY 플래그와 감시할 이벤트를 설정합니다. 여기서 감시할 이벤트는 DN_MODIFY(수정), DN_CREATE(생성), DN_DELETE(삭제)입니다.
  3. 이벤트 루프: pause() 함수를 사용하여 이벤트가 발생할 때까지 대기합니다. 이벤트가 발생하면 handle_event() 함수가 호출됩니다.
  4. 정리: 모니터링을 중지하고 파일 디스크립터를 닫습니다.

이 코드는 dnotify를 이용하여 지정된 디렉토리에서 파일 시스템 이벤트를 모니터링하는 기본적인 방법을 보여줍니다. 실제로는 inotify나 fanotify를 사용하는 것이 더 효율적이고 다양한 기능을 제공합니다.

반응형