본문 바로가기
IT/c, c++

특정 폴더 모니터링 inotify_add_watch 사용법

by TechTonic 2023. 6. 29.
반응형

리눅스 OS에서 특정 폴더의 이벤트(create, delete, modify 등)를 받아와야 할 경우가 있습니다.
예를 들어 특정 폴더에 파일이 생성되었거나, 삭제되었을 경우를 의미합니다.
그럼 이벤트를 받기 위해 필요한 inotify_add_watch에 대해 알아봅시다.

특정 폴더 모니터링 inotify_add_watch 사용법


inotify_add_watch() 함수 프로토타입

#include <sys/inotify.h>
int inotify_add_watch(int fd, const char *pathname, uint32_t mask);
  • fd: inotify_init 또는 inotify_init1 함수에 의해 반환된 inotify 인스턴스의 파일 디스크립터
  • pathname: 감시하려는 파일 또는 디렉토리의 경로
  • mask: 감시하려는 이벤트를 지정하는 비트 마스크입니다.(ex: IN_MODIFY, IN_CREATE, IN_DELETE 등)

mask 인자 값 유형

더보기

IN_ACCESS: 파일이 읽힐 때 알림을 받습니다.
IN_MODIFY: 파일이 수정될 때 알림을 받습니다.
IN_ATTRIB: 파일 속성이 변경될 때 알림을 받습니다.
IN_CLOSE_WRITE: 쓰기 가능한 파일이 닫힐 때 알림을 받습니다.
IN_CLOSE_NOWRITE: 읽기 전용 파일이 닫힐 때 알림을 받습니다.
IN_OPEN: 파일이 열릴 때 알림을 받습니다.
IN_MOVED_FROM: 파일이나 디렉토리가 이동되거나 삭제될 때 알림을 받습니다.
IN_MOVED_TO: 파일이나 디렉토리가 이동되어 올 때 알림을 받습니다.
IN_CREATE: 디렉토리디렉터리 내에 파일이나 디렉터리가 생성될 때 알림을 받습니다.
IN_DELETE: 디렉토리 내의 파일이나 디렉터리가 삭제될 때 알림을 받습니다.
IN_DELETE_SELF: 파일이나 디렉토리 자체가 삭제될 때 알림을 받습니다.
IN_MOVE_SELF: 파일이나 디렉토리 자체가 이동될 때 알림을 받습니다.

 

inotify_add_watch() 함수 반환값

성공적으로 완료되면 파일 디스크립터 값을 반환하고, 실패하면 -1을 반환합니다.

inotify_add_watch() 함수 사용 예제

코드 및 컴파일 방법에 대한 사용 예제를 알려드립니다.

 

1. 예제 코드

  • /home/test/test 폴더에 파일이 생성 및 삭제되었을 경우를 모니터링하는 코드입니다.

test.c

#include <sys/inotify.h>
#include <unistd.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define EVENT_BUF_LEN   ( 1024 * ( EVENT_SIZE + 16 ) )

int main() {
  int length, i = 0;
  int fd;
  int wd;
  char buffer[EVENT_BUF_LEN];

  fd = inotify_init();

  if (fd < 0) {
    perror("inotify_init fail.");
  }

  wd = inotify_add_watch(fd, "/home/test/test", IN_CREATE | IN_DELETE);

  length = read(fd, buffer, EVENT_BUF_LEN);

  if (length < 0) {
    perror("read fail");
  }

  while (i < length) {
    struct inotify_event *event = (struct inotify_event *) &buffer[i];
    if (event->len) {
      if (event->mask & IN_CREATE) {
        printf("IN_CREATE: New file %s created.\n", event->name);
      } else if (event->mask & IN_DELETE) {
        printf("IN_DELETE: File %s deleted.\n", event->name);
      } else if (event->mask & IN_MODIFY) {
        printf("IN_MODIFY: File %s modified.\n", event->name);
      }
    }
    i += EVENT_SIZE + event->len;
  }

  inotify_rm_watch(fd, wd);
  close(fd);
}

 

2. 컴파일 방법

gcc -o test test.c

위 커맨드로 컴파일을 하면 test 파일이 생성됩니다.

컴파일 결과

3. 실행 방법

./test

위 명령어를 통해 프로그램을 실행합니다.

프로그램 실행

실행 후 폴더 접근을 감시하기 위해 모니터링 중인 상태가 됩니다.

이때 감시하고자 하는 폴더에 파일이 생성 또는 삭제가 되면 해당 이벤트를 출력해 줍니다.

 

해당 폴더에 파일 생성 시 출력되는 내용을 확인해 봅시다.

echo "" > /home/test/test/111

위 커맨드를 실행하여 /home/test/test 폴더에 111이란 파일을 생성하면 해당 이벤트를 감지해서 로그가 출력됩니다.

inotify_add_watch 로그 출력 내용

 

반응형

댓글