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

Ric*_*ump 7 python linux windows filesystems locking

这篇文章指出,那

fd = os.open('foo.lock', os.O_CREAT|os.O_EXCL|os.O_RDWR)
Run Code Online (Sandbox Code Playgroud)

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

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

Fra*_*kH. 6

对于符合UN*X标准(根据OpenGroup认证的POSIX/IEEE 1003.1)系统,行为可以保证作为OpenGroups规范来强制执行此操作.引用:open(2)

O_EXCL
如果设置了O_CREAT和O_EXCL,如果文件存在,open()将失败.检查文件是否存在以及文件的创建(如果不存在)对于执行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重新实现库函数,但是可以维护语义.

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

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

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

  • `O_EXCL`没有那样做.唯一的问题是"O_EXCL"会导致调用失败,如果文件存在且指定了"O_CREAT". (6认同)