如果文件不存在,我需要创建一个文件,试图创建此文件的另一个进程将失败。我甚至需要在创建过程完成向其写入实际数据之前将文件视为“已创建”。
我向O_EXCL
阅读了open()
标志,所以似乎解决方案存在,但我有几个问题:
open()
后立即关闭文件,以便将其视为已创建,然后重新打开以进行书写吗?答案 0 :(得分:5)
open() man page表示您的方法可能在NFS上失败。
从O_EXCL上的部分:
与O_CREAT一起使用时,如果是文件 已经存在它是一个错误和 open()将失败。在这种背景下, 无论如何,都存在符号链接 它指向的地方。 O_EXCL坏了 在NFS文件系统上;程序 依靠它来执行锁定 任务将包含竞争条件。
它提出了一个更通用的解决方案:
执行原子的解决方案 使用lockfile锁定文件是为了 在同一文件上创建一个唯一的文件 系统(例如,包含主机名 和pid),使用link(2)建立链接 到lockfile。如果link()返回0, 锁是成功的。否则,请使用 stat(2)在唯一文件上检查是否 其链接数已增加到2,in 这种情况下锁也是 成功的。
有关各种问题和方法的更多详细信息,请参阅this Web page的“将文件用作锁定”部分。
答案 1 :(得分:1)
POSIX说:
如果设置了O_CREAT和O_EXCL,则如果文件存在,open()将失败。 检查文件是否存在以及创建文件if 它不存在对于其他线程应该是原子的 执行open()在同一目录中命名相同的文件名 O_EXCL和O_CREAT设置。
因此,使用O_EXCL
的其他进程会在创建后立即将其打开。