C 线程文件系统操作:到 ftw() 还是到 fts_open()?

C threaded filesystem operations: to ftw() or to fts_open()?

假设一个线程程序正在执行文件系统操作(遍历、读取、创建、删除、移动目录和文件)。

根据 an answerftw() 在这种情况下是不安全的。 (另外,ftw()需要全局变量,看起来不太优雅。)

我应该改用 fts_open() / fts_children() / fts_read() 吗?或者 scandir()?

使用 ftw() 的线程程序有什么不安全的(其中一些线程正在使用 ftw() 聚合数据而另一个线程是 deleting/moving 一些数据),确切地说,为什么?

正在将评论转化为答案。

如果一个线程执行chdir() while another thread is executing ftw() (or nftw()),一切都可能崩溃。在扫描目录时删除目录也可能会导致问题(但这可能发生在另一个进程中,更不用说其他线程了)。

便携性是个问题吗? fts(3) 功能套件可能并非随处可用(BSD/macOS 将其标记为 "expected to be included in a future IEEE Std 1003.1-1988 ('POSIX.1') revision",这提高了其可移植性的机会,但不能保证它 — 它不在 POSIX 2018(见下文).

如果您在线程应用程序中,您可能需要使用 FTS_NOCHDIR,或者谨慎使用 *at() 函数来访问文件。

Portability is not an issue. So, changing the working directory of the process (from different threads) is the only thing that can lead to inconsistencies? Are absolute paths a magic fix? Is FTS_NOCHDIR guaranteed to solve this issue?

我不知道更改目录是否是 运行 出现问题的唯一方法;这只是把事情搞砸的一种相当重要的方式。如果您有两个线程或两个进程在工作,一个尝试通过 fts_read() 等扫描文件系统,另一个进行任意更改(例如将目录从树中的一个位置移动到另一个位置),那么我可以看到通过扫码进行的会计核算中出现的各种混淆机会——漏掉了应该计算的东西,把应该只计算一次的东西计算了两次。

我要提到 nftw() 因为它还没有出现。与 ftw() 相比,它有几个优点,但线程安全不是其中之一。因此,它主要是一个旁白,因为困扰 fts_read()ftw() 的问题也困扰着 nftw().

请注意,scandir() 读取并选择单个目录的内容,而无需遍历层次结构。它专为与 ftw() 和朋友不同的工作而设计。它不是 ftw()

的简单替代品

看起来 fts(3) 已被考虑但因 POSIX 被拒绝:http://www.opengroup.org/platform/ballots/1003.1a.d14.crb.txt