和借鉴: How to monitor a folder with all subfolders and files inside?我们是否需要第二个线程来处理inotify耗时的工作?
我需要监控与* .LOG的扩展名的文件的目录。如果新文件被创建或被移入,我将处理该文件。处理每个文件需要不同的时间。
问题>我是否需要创建一个线程来侦听inotify事件并将新文件名推入队列并使用另一个线程来处理队列?我担心的是,如果我不使用单独的线程,那么inotify可能无法跟踪由某些大文件引起的更改。
我在模拟sleep
时处理每个日志文件没有任何多线程代码的问题。在我看来,inotify总是纠正得到目录中的所有创建/移动的文件。
这是我的模拟。
终止1: 我运行该应用程序并在主内部侦听inotify事件。每当处理一个日志文件时,我将睡眠10秒钟,然后将文件名打印到控制台。
Terminte 2: 我会在时间T1将多个文件复制到受监视的目录。 在应用程序完成处理所有以前的文件之前,我将在时间T2移动多个文件。 然后再次T3,我将在应用程序完成之前将多个文件复制到目录中。
观察: 该应用程序处理所有日志文件,如我所料。
问题>这是预期的inotify行为还是我今天早上跑步幸运? 换句话说,如果仿真如上所示,将缓存未处理的事件吗?
FYI:代码片段我用:
#define EVENT_SIZE (sizeof (struct inotify_event))
#define BUFFER_LEN (1024 * (EVENT_SIZE + NAME_MAX + 1))
wd = inotify_add_watch(fd, root.string().c_str(), IN_CREATE | IN_MOVED_TO);
while (true)
{
length = read(fd, buffer, BUFFER_LEN);
for (int i = 0; i < length;)
{
const inotify_event *ptrEvent = reinterpret_cast<inotify_event *>(&buffer[i]);
... // processing the event
sleep(10); // to simulate the long work
i += INO_EVENT_SIZE + ptrEvent->len;
}
}
inotify_add_watch()返回的fd是否与'select()'一起工作? –
@RichardHodges,检查这一个http://stackoverflow.com/questions/37125002/why-perform-selective-read-on-the-inotify-instance-using-select-call – q0987