gpt4 book ai didi

linux - 如何使用 readdir/inotify 避免这种竞争情况?

转载 作者:太空狗 更新时间:2023-10-29 12:37:29 25 4
gpt4 key购买 nike

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

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() 循环什么都不做,但这感觉像是一个糟糕的 hack。

最佳答案

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

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

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

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

关于linux - 如何使用 readdir/inotify 避免这种竞争情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7157995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com