2016-05-11 22 views
0

和借鉴: 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; 
    } 
} 
+0

inotify_add_watch()返回的fd是否与'select()'一起工作? –

+0

@RichardHodges,检查这一个http://stackoverflow.com/questions/37125002/why-perform-selective-read-on-the-inotify-instance-using-select-call – q0987

回答

0

让我们做一个思想实验。显然,有些事件可供您阅读。但是,让我们说你不读它们。如果队列的大小不受限制,则会导致内存不足,因此这是非启动器。如果队列被绑定,那么您必须在某个点开始丢弃事件,否则将产生所述事件的BLOCK操作。后者显然不是首发 - 你不希望你的FS操作被阻止,因为一个使用inotify监视器的进程正在等待一些垃圾,而没有阅读任何内容。

但最重要的是,你很可能不希望首先使用inotify。这里的整个业务看起来都是错误的设计。你可能想要的是一个目录,右键,它将文件重命名为。所以当一个文件出现时,它是安全的阅读。然后,根据具体情况,您可能需要获取SIGUSR1或其他内容来触发目录处理或通过具有确切文件名的unix套接字获取请求。

有问题的目录只能包含未处理的文件。

相关问题