【发布时间】:2012-08-27 18:05:33
【问题描述】:
使用 inotify 通过在目录上添加监视来监视目录中创建的任何新文件
fd = inotify_init();
wd = inotify_add_watch(fd, "filename_with_path", IN_CLOSE_WRITE);
inotify_add_watch(fd, directory_name, IN_CLOSE_WRITE);
const int event_size = sizeof(struct inotify_event);
const int buf_len = 1024 * (event_size + FILENAME_MAX);
while(true) {
char buf[buf_len];
int no_of_events, count = 0;
no_of_events = read(fd, buf, buf_len);
while(count < no_of_events) {
struct inotify_event *event = (struct inotify_event *) &buf[count];
if (event->len) {
if (event->mask & IN_CLOSE_WRITE) {
if (!(event->mask & IN_ISDIR)) {
//It's here multiple times
}
}
}
count += event_size + event->len;
}
当我将文件 scp 到目录时,它会无限循环。这段代码有什么问题?它也显示相同的事件名称和事件掩码。因此,它表明该事件发生了相同的无限次。
没有中断语句。如果我找到一个事件,我只需打印它并继续等待 read() 上的另一个事件,这应该是一个阻塞调用。相反,它开始无限循环。这意味着, read 不会阻塞它,而是无限地为一个文件返回相同的值。
整个操作在单独的 boost::thread 上运行。
编辑:
对不起大家。我得到的错误不是因为 inotify 而是因为 sqlite 一开始很难检测到。我想我在这里开枪了。经过进一步调查,我确实发现 inotify 运行良好。但错误实际上来自 sqlite 命令:ATTACH
该命令并非应有的现成命令。它正在将一些元数据写入文件。因此 inotify 一次又一次地收到通知。由于它们发生得如此之快,它搞砸了应用程序。我最终不得不分解代码以了解原因。
谢谢大家。
【问题讨论】:
-
我看不出这段代码有什么问题。也许您没有包含在 if 块中的代码使用了一个跳过
count变量增量的break语句? -
没有中断语句。如果我找到一个事件,我只是打印它并继续等待 read() 上的另一个事件,这应该是一个阻塞调用。
-
在增量后打印
count的值。它会打印预期的内容吗? -
发生这种情况时在您的程序上运行
strace,它可能会提供更多信息 -
count 增加得很好。只有 [read] 永远一次又一次地赋予我相同的价值。
标签: c++ c linux boost-thread inotify