python – 哪个系统/文件系统是os.open()原子?

This篇文章指出

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

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

提到标志的docs状态在Unix和Windows上可用,因此它看起来像一个诱人的,跨平台的文件锁定方法(标志O_CREAT和O_EXCL确保调用进程创建文件).

最佳答案
对于符合UN * X标准(根据OpenGroup认证的POSIX / IEEE 1003.1)系统,行为是有保证的,因为open(2)的OpenGroups规范要求这样做.引用:

O_EXCL
If O_CREAT and O_EXCL are set, open() shall fail if the file exists. The check for the existence of the file and the creation of the file if it does not exist shall be atomic with respect to other threads executing open() naming the same filename in the same directory with O_EXCL and O_CREAT set. If O_EXCL and O_CREAT are set, and path names a symbolic link, open() shall fail and set errno to [EEXIST], regardless of the contents of the symbolic link. If O_EXCL is set and O_CREAT is not set, the result is undefined.

“常见的”UN * X和UN * X系统(Linux,MacOSX,* BSD,Solaris,AIX,HP / UX)肯定会表现得那样.

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

我不知道哪些广泛使用的系统不符合要求; QNX虽然没有经过POSIX认证,但在open()的文档中也有相同的声明.* BSD联机帮助页没有明确提到“原子性”,但Free / Net / OpenBSD实现了它.甚至像SymbianOS这样的外来物(像Windows一样没有UN * X-ish开放系统调用)也可以进行原子打开/创建.

对于更有趣的结果,尝试找到一个操作系统/ C运行时库,它有open()但没有为它实现上述语义…以及Python将与线程一起运行(让你到那里,MSDOS … ).

编辑:我的帖子特别关注“哪些操作系统具有开放的这种特性?” – 答案是“几乎所有人”. WRT.但是,对于文件系统来说,图片是不同的,因为网络文件系统 – 无论是NFS,SMB / CIFS还是其他人,并不总是维护O_EXCL,因为这可能导致拒绝服务(如果客户端打开了(…,O_EXCL, …)然后只是停止与文件服务器通话/关闭,其他人都将被锁定).

转载注明原文:python – 哪个系统/文件系统是os.open()原子? - 代码日志