如果文件不存在,我需要创建一个文件,这样尝试创建该文件的另一个进程就会失败。我需要甚至在创建过程完成向其中写入实际数据之前就将文件视为“已创建”。
我读到O_EXCL
标记为open()
,看来解决方案是存在的,但是我有几个问题:
- 你有这种技术的经验吗?有多好? (我想我不能拥有数据库级别的原子性,但是足够好就是......好吧,足够了)
- 我应该立即关闭文件吗
open()
这样它就被认为已创建,然后重新打开它进行写入?
- 有什么微妙之处需要注意吗?
The open() 手册页 http://linux.die.net/man/2/open说你的方法在 NFS 上可能会失败。
来自 O_EXCL 部分:
当与 O_CREAT 一起使用时,如果文件
已经存在,这是一个错误,并且
open() 将失败。在此背景下,一个
符号链接存在,无论
它指向哪里。 O_EXCL 已损坏
在 NFS 文件系统上;程序其中
依靠它来执行锁定
任务将包含竞争条件。
它提出了一个更通用的解决方案:
执行原子操作的解决方案
使用锁定文件的文件锁定是
在同一文件上创建唯一的文件
系统(例如,合并主机名
和 pid),使用 link(2) 建立链接
到锁文件。如果 link() 返回 0,
锁定成功。否则,使用
stat(2) 在唯一文件上检查是否
它的链接计数已增加到 2,
这种情况下锁也是
成功的。
请参阅《使用文件作为锁》部分这个网页 http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/avoid-race.html有关各种问题和方法的更多详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)