os.open() 在哪些系统/文件系统上是原子的?

2023-11-23

This文章指出,

fd = os.open('foo.lock', os.O_CREAT|os.O_EXCL|os.O_RDWR)

“在大多数文件系统上是原子的”。这是真的吗(在 Unix 和 Windows 上)?在哪些文件系统上?

The docs声明提到的标志在 Unix 和 Windows 上可用,因此它看起来像是一种诱人的跨平台文件锁定方法(标志O_CREAT and O_EXCL确保调用进程创建该文件)。


对于符合 UN*X 标准(根据 OpenGroup 经过认证的 POSIX / IEEE 1003.1)系统,该行为按照 OpenGroups 规范得到保证open(2) mandate这。引用:

O_EXCL
如果设置了 O_CREAT 和 O_EXCL,则当文件存在时 open() 将失败。检查文件是否存在,如果不存在则创建文件atomic相对于执行 open() 的其他线程,在同一目录中使用 O_EXCL 和 O_CREAT 设置命名相同的文件名。如果设置了 O_EXCL 和 O_CREAT,并且路径名为符号链接,则 open() 将失败并将 errno 设置为 [EEXIST],无论符号链接的内容如何。如果设置了 O_EXCL 而未设置 O_CREAT,则结果未定义。

“常见”UN*X 和类 UN*X 系统(Linux、MacOSX、*BSD、Solaris、AIX、HP/UX)的行为肯定是这样的。

由于 Windows API 没有open()因此,库函数必须根据本机 API 重新实现,但可以保持语义。

不知道哪些系统被广泛使用wouldn't遵守; QNX 虽然没有经过 POSIX 认证,但在其文档中也有相同的声明:open()。 *BSD 手册页没有明确提及“原子性”,但 Free/Net/OpenBSD 实现了它。甚至像 SymbianOS 这样的外来操作系统(它像 Windows 一样没有 UN*X 风格)open系统调用)可以进行原子打开/创建。

要获得更有趣的结果,请尝试查找具有以下功能的操作系统/C 运行时库open() but doesn't为它实现上述语义......并且Python将在其上运行线程(明白了,MSDOS ...)。

Edit:我的帖子特别关注“哪些操作系统具有此特征”open?” - 答案是“几乎所有”。Wrt. to文件系统不过,情况有所不同,因为网络文件系统- 无论是 NFS、SMB/CIFS 还是其他,并不总是维护O_EXCL因为这可能会导致拒绝服务(如果客户端执行open(..., O_EXCL, ...)然后停止与文件服务器通信/关闭,其他人都将被锁定)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

os.open() 在哪些系统/文件系统上是原子的? 的相关文章

随机推荐