리눅스 OS에서 특정 폴더의 이벤트(create, delete, modify 등)를 받아와야 할 경우가 있습니다.
예를 들어 특정 폴더에 파일이 생성되었거나, 삭제되었을 경우를 의미합니다.
그럼 이벤트를 받기 위해 필요한 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이란 파일을 생성하면 해당 이벤트를 감지해서 로그가 출력됩니다.
'IT > c, c++' 카테고리의 다른 글
pthread 에서 mutex 사용법 #Feat. pthread_mutex_lock, pthread_mutex_unlock (11) | 2022.12.14 |
---|---|
VSCode 에서 pthread 사용하는 방법 (26) | 2022.12.09 |
Visual Studio Code C/C++ 환경 구축 #Feat. VScode (12) | 2022.12.09 |
댓글