使用inotify监视文件

我正在使用inotify来监视本地文件,例如“/ root / temp”使用

inotify_add_watch(fd, "/root/temp", mask). 

当这个文件被删除时,程序将被read(fd, buf, bufSize)函数阻塞。 即使我创build一个新的“/ root / temp”文件,程序仍然是通过读取function阻止的。 我想知道如果inotify可以检测到监控的文件被创build,并且读取函数可以从fd得到的东西,使读取将永远不会被阻止。 这是我的代码:

 uint32_t mask = IN_ALL_EVENTS; int fd = inotify_init(); int wd = inotify_add_watch(fd, "/root/temp", mask); char *buf = new char[1000]; int nbytes = read(fd, buf, 500); 

我监视了所有事件。

Solutions Collecting From Web of "使用inotify监视文件"

问题是,默认情况下, read是一个阻塞操作。

如果您不想阻止它,请在read之前使用selectpoll 。 例如:

 struct pollfd pfd = { fd, POLLIN, 0 }; int ret = poll(&pfd, 1, 50); // timeout of 50ms if (ret < 0) { fprintf(stderr, "poll failed: %s\n", strerror(errno)); } else if (ret == 0) { // Timeout with no events, move on. } else { // Process the new event. struct inotify_event event; int nbytes = read(fd, &event, sizeof(event)); // Do what you need... } 

注意 :未经测试的代码。

为了看到一个新的文件创建,你需要看目录,而不是文件。 看一个文件应该看到它被删除的时间(IN_DELETE_SELF),但是如果一个新的文件被创建为相同的名字,可能不会发现。

您应该可以观看IN_CREATE |的目录 IN_MOVED_TO查看新创建的文件(或从另一个地方移入的文件)。

一些编辑器和其他工具(如rsync)可能会以不同的名称创建一个文件,然后重命名它。