在阅读手册半小时后,我想分享我的发现,看到其他问题中的许多人只指向readdir
,这不是线程安全的。
答案 0 :(得分:1)
tl; dr 不要使用readdir
或readdir_r
,它们不安全!使用scandir
。
readdir
不是线程安全的(实际上,它是POSIX中唯一一个已知存在这个缺陷的与目录相关的函数)。当然,你可以在简单的程序中使用它,但要小心!
readdir_r
是线程安全的,但使用起来非常痛苦,特别是因为你必须分配自己的dirent
缓冲区,而且它并不像你想象的那样直截了当(因为它不是保证文件的名称适合所有* nixes和所有文件系统中所有情况下的结构内提供的数组)。 There are workarounds,但是当您使用它们时,“看看,无论发生什么”。
到目前为止,我所知道的唯一完全安全且直接使用的功能是scandir
:它是线程安全的和它基本上为你做了一切,让你有一个干净的数组目录条目。虽然它可能不适合任何场合,但它绝对可以减轻你自己忍受的许多痛苦。