如何使用 readdir/inotify 避免这种竞争状况?

问题描述 投票:0回答:1

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

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()
循环不会执行任何操作,但这感觉像是一个糟糕的黑客。

linux inotify readdir
1个回答
3
投票

你根本做不到。你破解的越多,你得到的竞争条件就越多。

最简单的实际工作解决方案是在使用

opendir()
之前设置手表,并保留已使用名称(或其哈希值)的列表(集)。

但这也并不完美。用户可以在文本编辑器中打开文件;您修复它,用户保存它,并且该目录无论如何都包含未修复的文件,尽管它在您的列表中。

最好的方法是让程序能够根据内容实际区分使用过的文件。换句话说,您设置监视,在

readdir()
结果上调用命令,然后在 inotify 结果上调用它,并让命令本身知道文件是否已经正常。

© www.soinside.com 2019 - 2024. All rights reserved.