我使用inotify监视本地文件,例如"/root/temp“,使用
inotify_add_watch(fd, "/root/temp", mask).当此文件被删除时,程序将被read(fd, buf, bufSize)函数阻止。即使我创建了一个新的"/root/temp“文件,程序仍然被read函数阻塞。我想知道inotify是否可以检测到被监视的文件已经创建,并且读取函数可以从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);我监视了所有的事件。
发布于 2011-01-12 11:07:27
问题是read在默认情况下是一个阻塞操作。
如果您不想阻止它,请在read之前使用select或poll。例如:
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...
}注释:未测试的代码。
发布于 2011-01-12 16:04:46
为了查看创建的新文件,您需要查看目录,而不是文件。监视文件时应能看到该文件何时被删除(IN_DELETE_SELF),但如果创建了同名的新文件,则可能看不到该文件。
您可能应该查看目录中的IN_CREATE | IN_MOVED_TO,以查看新创建的文件(或从其他位置移入的文件)。
一些编辑器和其他工具(例如rsync)可能会用不同的名称创建一个文件,然后重命名。
https://stackoverflow.com/questions/4664975
复制相似问题