【发布时间】:2010-03-23 16:45:16
【问题描述】:
在此目录中创建或删除文件时,通过 readdir() 或 scandir() 读取目录条目是否安全?我应该更喜欢一个吗?
编辑:当我说“安全”时,我的意思是这些函数返回的条目是有效的,可以在不使程序崩溃的情况下进行操作。
谢谢。
【问题讨论】:
标签: c file filesystems
在此目录中创建或删除文件时,通过 readdir() 或 scandir() 读取目录条目是否安全?我应该更喜欢一个吗?
编辑:当我说“安全”时,我的意思是这些函数返回的条目是有效的,可以在不使程序崩溃的情况下进行操作。
谢谢。
【问题讨论】:
标签: c file filesystems
这取决于您所说的“安全”。从某种意义上说,它们是安全的,它们不应使您的程序崩溃。但是,如果您在读取/扫描该目录时创建/删除文件,则返回的文件集可能不是最新的。
当读取/扫描目录以查找目录条目时,文件指针(目录只是一种特殊类型的文件)向前移动。但是,根据文件系统,可能没有什么可以阻止在文件指针后面的空目录条目槽中创建新文件。因此,readdir()/scandir() 可能不会立即检测到新添加的目录条目。类似的推理适用于文件删除/目录条目删除。
希望这会有所帮助。
【讨论】:
您对安全的定义是什么?您不会使系统崩溃,并且 readdir/scandir 不会使您的程序崩溃。尽管他们可能会为您提供立即过时的数据。
读取目录的通常语义是,如果您从头到尾读取目录,您将看到在此期间未更改的所有文件恰好一次,并且您将看到创建或删除的文件在此期间最多一次。
在类 UNIX 系统上,readdir() 和 scandir() 是在相同的底层系统调用(Linux 中的 getdents(),BSD 中的 getdirentries())之上实现的库函数。所以他们在这方面的行为应该没有太大区别。我认为 readdir() 更标准一些,因此更便携。
【讨论】: