在Linux上创建原子文件?

时间:2011-03-06 14:06:43

标签: c++ linux filesystems createfile atomicity

如果文件不存在,我需要创建一个文件,试图创建此文件的另一个进程将失败。我甚至需要在创建过程完成向其写入实际数据之前将文件视为“已创建”。

我向O_EXCL阅读了open()标志,所以似乎解决方案存在,但我有几个问题:

  1. 你对这种技术有经验吗?有多好? (我想我不能拥有数据库级别的原子性,但是足够好就是......好吧,够了)
  2. 我应该在open()后立即关闭文件,以便将其视为已创建,然后重新打开以进行书写吗?
  3. 有什么细微之处需要注意吗?

2 个答案:

答案 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的其他进程会在创建后立即将其打开。