[英]On which systems/filesystems is os.open() atomic?
對於符合UN * X標准(根據OpenGroup認證的POSIX / IEEE 1003.1)系統,行為是有保證的,因為open(2)
的OpenGroups規范要求這樣做。 引用:
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, ...)
然后只是停止與文件服務器通話/關閉,其他人都將被鎖定)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.