我使用inotify监视本地文件,例如“/ root / temp”使用
inotify_add_watch(fd, "/root/temp", mask).
删除此文件后,read(fd, buf, bufSize)
功能将阻止该程序。即使我创建了一个新的“/ root / temp”文件,程序仍然被读取函数阻塞。我想知道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);
我监控了所有事件。
答案 0 :(得分:19)
问题是默认情况下read
是阻止操作。
如果您不希望阻止,请在select
之前使用poll
或read
。例如:
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...
}
注意:未经测试的代码。
答案 1 :(得分:3)
要查看创建的新文件,您需要查看目录,而不是文件。观察文件时应该看到它被删除(IN_DELETE_SELF),但是如果创建了一个具有相同名称的新文件,则可能无法发现。
你应该看一下IN_CREATE |的目录IN_MOVED_TO用于查看新创建的文件(或从其他位置移入的文件)。
某些编辑器和其他工具(例如rsync)可能会以不同的名称创建文件,然后重命名。