来自 Linux 编程接口
如果程序必须确保它是文件的创建者,那么调用 open() 时应使用 O_EXCL 标志
我想知道什么时候“程序必须确保它是文件的创建者”?
这与程序希望文件的所有者是运行该程序的进程的有效ID的情况有关吗?
对于给定的文件,既然我们可以修改文件的所有者,那么如何才能找到文件的创建者呢?
答案1
O_EXCL 标志与 O_CREAT 标志一起使用,意味着如果文件已经存在,则调用open
将失败。如果该文件不存在,将尝试创建并打开它。
其用途之一是创建一个简单的锁定文件。如果多个进程尝试使用 O_CREAT 和 O_EXCL 标志打开同一个文件,则一个进程将成功,其余进程将失败。当然,如果该文件已经存在,例如因为先前的进程退出而没有删除该文件,没有任何的后续尝试都会成功,因此这不是管理锁的最可靠的方法。
另一个用途是创建一个用于写入的文件,该进程确信没有其他进程会写入该文件。如果您要在 中创建文件/tmp
,其中许多其他进程正在创建具有相似(可能相同)名称的文件,则可以使用此选项。 mkstemp
glibc 中的函数使用open
O_CREAT 和 O_EXCL 标志进行调用。
Unix/Linux 不记录文件的创建者(如果操作系统支持,可能会发出审核记录。)