当在 Linux 2.6 内核和 NFSv3 中时open("fname", O_CREAT|O_EXCL)
生效了吗?目前的规范open(2)
系统调用文档(http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html)说一切都很好:
- O_EXCL
- ...
On NFS, O_EXCL is only supported when using NFSv3 or later on kernel
2.6 or later. In NFS environments where O_EXCL support is not
provided, programs that rely on it for performing locking tasks will
contain a race condition. Portable programs that want to perform
atomic file locking using a lockfile, and need to avoid reliance on NFS
support for O_EXCL, can ...
这看起来好像所有 2.6 内核都可以,但是手册页变更日志(大约最新内核 2.6.23)开始指示有效性四年2.6.0 上线后,网络上充斥着董事会用户在过去一两年内谴责这种使用。我想在 RHEL 5 (2.6.18) 系统上使用此设置,但我无法确定它何时真正变得安全。有人有明确的答案吗?
显然,NFS 的人声称任何来自NFSv3和Linux2.6.5打开就可以了。
From http://nfs.sourceforge.net/#faq_d10:
-
D10. I'm trying to use flock()/BSD locks to lock files used on multiple clients, but the files become corrupted. How come?
- 答:flock()/BSD 锁仅在 2.6.12 之前的 Linux NFS 客户端上本地起作用。使用 fcntl()/POSIX 锁来确保文件锁对其他客户端可见。
- Here are some ways to serialize access to an NFS file.
- 使用 fcntl()/POSIX 锁定 API。这种类型的锁定通过 NLM 协议或 NFSv4 跨多个客户端提供字节范围锁定。
- 使用单独的锁定文件,并创建指向它的硬链接。请参阅 creat(2) 手册页的 O_EXCL 部分中的描述。
- 值得注意的是,直到早期的 2.6 内核,O_EXCL 创建在 Linux NFS 客户端上都不是原子的。不要使用 O_EXCL 在多个 NFS 客户端之间创建并期望原子行为,除非您运行的内核更新于2.6.5.
- ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)