在Linux上创建原子文件?

dav*_*vka 2 c++ linux filesystems createfile atomicity

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

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

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

pay*_*yne 5

open()的手册页说,你的方法可能会失败在NFS上.

从O_EXCL部分:

与O_CREAT一起使用时,如果文件已存在,则表示错误,open()将失败.在这种情况下,无论指向何处,都存在符号链接.O_EXCL在NFS文件系统上被破坏; 依赖它来执行锁定任务的程序将包含竞争条件.

它提出了一个更通用的解决方案:

使用锁文件执行原子文件锁定的解决方案是在同一文件系统上创建一个唯一文件(例如,合并主机名和pid),使用link(2)建立到lockfile的链接.如果link()返回0,则锁定成功.否则,在唯一文件上使用stat(2)来检查其链接计数是否已增加到2,在这种情况下锁定也是成功的.

有关各种问题和方法的详细信息,请参阅本网页的"将文件用作锁定"部分.