簡體   English   中英

os.open()是哪個系統/文件系統是原子的?

[英]On which systems/filesystems is os.open() atomic?

這篇文章指出,那

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

“在大多數文件系統上是原子的”。 這是真的(在Unix和Windows上)? 在哪些文件系統上?

文檔聲明提到的標志在Unix和Windows上可用,因此它看起來像一個誘人的,跨平台的文件鎖定方法(標志O_CREATO_EXCL確保調用進程創建文件)。

對於符合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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM