如何使用readdir / inotify避免这种竞争条件?

时间:2011-08-23 08:09:28

标签: linux inotify readdir

假设我想对目录中的所有文件调用某个命令,并设置监视以对在该目录中创建的所有文件调用该命令。如果我这样做:

while( ( sdi = readdir( d )) != NULL ) { ... }
closedir( d );
/* Files created here will be missed */
inotify_add_watch( ... );

然后可能会丢失一些文件。如果我打电话给inotify_add_watch() 在readdir()之前,文件可能会被执行两次(它需要 一个相当多的基础设施,以防止两次行动,似乎 边缘情况很难处理)。有一种简单的方法可以避免 必须记录readdir循环期间处理的所有文件的名称 将它们与inotify_event结构中返回的名称进行比较?我可以 最小化必要的比较数量:

while( ( sdi = readdir( d )) != NULL ) { ... }
inotify_add_watch( ... );
while( ( sdi = readdir( d )) != NULL ) { /* record name */ ... }
closedir( d );

通常第二个readdir()循环什么也不做,但这感觉就像一个糟糕的黑客。

1 个答案:

答案 0 :(得分:1)

你根本做不到。你越黑了,你就会越多的竞争条件。

最简单的实际工作解决方案是在使用opendir()之前设置手表,并保留已使用名称(或其哈希值)的列表(设置)。

但这也不完美。用户可以在文本编辑器中打开文件;你修复它,用户保存它,目录中包含不固定的文件,尽管它在你的列表中。

最好的方法是让程序能够通过内容实际区分使用过的文件。换句话说,你在readdir()结果上设置watch,call命令,然后在inotify结果上调用它,让命令本身知道文件是否已经完好。