使用 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 一次又一次地收到通知。由于它们发生得如此之快,它搞砸了应用程序。我最终不得不分解代码以了解原因。
谢谢大家。