개발/리눅스
I NOTIFY
-=HaeJuK=-
2024. 5. 21. 10:56
728x90
반응형
INOTIFY는 리눅스 커널의 파일 시스템 이벤트 모니터링 메커니즘으로, 파일 시스템 내의 변경 사항을 감시하고 사용자 공간 애플리케이션에 알림을 제공합니다. INOTIFY는 특히 파일과 디렉토리의 수정, 생성, 삭제 등의 이벤트를 모니터링하는 데 유용합니다. 시스템 관리자와 개발자에게 파일 시스템 활동을 추적하고 이에 따라 적절한 조치를 취할 수 있는 방법을 제공합니다.
다음은 INOTIFY에 대한 주요 기능과 세부 사항입니다:
- 파일 및 디렉토리 모니터링: INOTIFY는 특정 파일이나 디렉토리에서 발생하는 이벤트를 모니터링할 수 있습니다. 이를 통해 파일 시스템의 변경 사항을 실시간으로 감시할 수 있습니다.
- 이벤트 유형: INOTIFY는 파일 또는 디렉토리의 생성, 삭제, 수정, 이동 등의 다양한 이벤트를 감지할 수 있습니다.
- 효율성: INOTIFY는 파일 시스템 이벤트를 효율적으로 감지하고 처리할 수 있는 메커니즘을 제공합니다. 이는 폴링(polling) 방식보다 효율적이며 시스템 리소스를 절약할 수 있습니다.
- 사용자 공간 인터페이스: INOTIFY는 사용자 공간 애플리케이션에 인터페이스를 제공하여 이벤트를 등록하고 처리할 수 있게 합니다. 이를 통해 애플리케이션은 파일 시스템 이벤트에 대한 실시간 대응이 가능합니다.
예제 사용 사례
- 파일 동기화 도구: 파일 시스템의 변경 사항을 감지하여 변경된 파일을 동기화합니다.
- 로그 모니터링: 로그 파일의 변경 사항을 실시간으로 감시하여 로그 업데이트를 즉시 처리합니다.
- 보안: 중요 파일의 변경 사항을 모니터링하여 무단 수정이나 삭제를 감지합니다.
- 백업 시스템: 파일 변경 사항을 감지하여 변경된 파일만 백업합니다.
기본 사용법
INOTIFY를 프로그램에서 사용하려면 일반적으로 다음 단계를 수행합니다:
- INOTIFY 초기화: inotify_init() 또는 inotify_init1()을 사용하여 새로운 INOTIFY 인스턴스를 생성합니다.
- 워치 추가: inotify_add_watch()을 사용하여 모니터링할 파일이나 디렉토리와 이벤트를 지정합니다.
- 이벤트 읽기: read()를 사용하여 INOTIFY 파일 디스크립터에서 이벤트를 가져옵니다.
- 이벤트 처리: 애플리케이션에서 필요한 대로 이벤트를 처리합니다.
예제 코드
#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를 초기화하고 특정 이벤트를 모니터링할 워치를 추가한 다음, 이벤트를 처리하는 루프로 들어갑니다. 실제 애플리케이션에서는 적절한 이벤트 처리 및 정리 코드를 추가해야 합니다.
728x90