#include <stdlib.h>
#include <stdio.h>
#include <inotifytools/inotifytools.h>
#include <inotifytools/inotify.h>
enum {
ACTION_NULL_WD,
ACTION_ADD_WD,
ACTION_DEL_WD,
};
int main(int argc, const char **argv)
{
int err = 0;
if (!inotifytools_initialize()) {
printf("inotifytools_initialize failed\n");
return -1;
}
inotifytools_initialize_stats();
const char *monitor_path = ".";
if (argc > 1) {
monitor_path = argv[1];
}
printf("Monitor dir(%s)\n", monitor_path);
if (!inotifytools_watch_recursively(monitor_path, IN_ALL_EVENTS)) {
printf("inotifytools_watch_recursively failed\n");
return -1;
}
inotifytools_set_printf_timefmt("%F %T");
struct inotify_event * event = inotifytools_next_event(-1);
char path[256];
while (event) {
inotifytools_printf( event, "%T %w%f %e\n" );
if (IN_ISDIR&event->mask) {
int action = ACTION_NULL_WD;
if ((IN_DELETE|IN_DELETE_SELF|IN_MOVED_FROM)&event->mask) {
action = ACTION_DEL_WD;
snprintf(path, sizeof(path), "%s%s",
inotifytools_filename_from_wd(event->wd),
event->name);
printf("Remove path(%s) from wd\n", path);
} else if (((IN_CREATE|IN_MOVED_TO)&event->mask) && (IN_ISDIR&event->mask)) {
action = ACTION_ADD_WD;
snprintf(path, sizeof(path), "%s%s",
inotifytools_filename_from_wd(event->wd),
event->name);
printf("Add path(%s) into wd\n", path);
}
if (ACTION_ADD_WD == action) {
if (!inotifytools_watch_recursively(path, IN_ALL_EVENTS)) {
printf("inotifytools_watch_recursively failed\n");
return -1;
}
} else if (ACTION_DEL_WD == action) {
if (!inotifytools_remove_watch_by_wd(event->wd)) {
printf("inotifytools_remove_watch_by_wd failed. event->wd(%d)\n", event->wd);
return -1;
}
}
}
event = inotifytools_next_event(-1);
}
printf("Exit\n");
return 0;
}
使用inotify监视Linux文件变化
最新推荐文章于 2024-08-22 12:21:49 发布