【发布时间】:2016-05-11 13:31:27
【问题描述】:
参考: How to monitor a folder with all subfolders and files inside?
我需要监视一个目录中是否有任何扩展名为 *.log 的文件。如果创建或移入新文件,我将处理该文件。处理每个文件需要不同的时间。
问题> 我是否需要创建一个线程来监听 inotify 事件并将新文件名推送到队列中并使用另一个线程来处理队列?我担心的是,如果我不使用单独的线程,那么 inotify 可能无法跟踪由某些大文件引起的更改。
我在处理每个日志文件时使用sleep 模拟了这个问题,而没有任何多线程代码。在我看来,inotify 总是更正获取目录中所有创建/移动的文件。
这是我的模拟。
终止 1: 我运行该应用程序并在主程序中侦听 inotify 事件。每当处理一个日志文件时,我会休眠 10 秒,然后将文件名打印到控制台。
终结者 2: 我将在时间 T1 将多个文件复制到受监视的目录。 在应用程序完成处理所有以前的文件之前,我将在时间 T2 移动多个文件。 然后再次T3时间,我将在应用程序完成之前将多个文件复制到目录中。
观察: 该应用程序按我的预期处理了所有日志文件。
问题> 这是 inotify 的预期行为还是我今天早上很幸运? 也就是说,如果像上面那样模拟的话,是否会 inotify 缓存未处理的事件?
仅供参考:我使用的代码 sn-p:
#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,看看这个stackoverflow.com/questions/37125002/…
标签: c++ multithreading