首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用inotify监视文件

使用inotify监视文件
EN

Stack Overflow用户
提问于 2011-01-12 11:00:33
回答 2查看 16.9K关注 0票数 8

我使用inotify监视本地文件,例如"/root/temp“,使用

代码语言:javascript
复制
inotify_add_watch(fd, "/root/temp", mask).

当此文件被删除时,程序将被read(fd, buf, bufSize)函数阻止。即使我创建了一个新的"/root/temp“文件,程序仍然被read函数阻塞。我想知道inotify是否可以检测到被监视的文件已经创建,并且读取函数可以从fd获得一些东西,这样读取就不会永远被阻止。下面是我的代码:

代码语言:javascript
复制
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);

我监视了所有的事件。

EN

回答 2

Stack Overflow用户

发布于 2011-01-12 11:07:27

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

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

代码语言:javascript
复制
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...
}

注释:未测试的代码。

票数 21
EN

Stack Overflow用户

发布于 2011-01-12 16:04:46

为了查看创建的新文件,您需要查看目录,而不是文件。监视文件时应能看到该文件何时被删除(IN_DELETE_SELF),但如果创建了同名的新文件,则可能看不到该文件。

您可能应该查看目录中的IN_CREATE | IN_MOVED_TO,以查看新创建的文件(或从其他位置移入的文件)。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4664975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档