2010-08-04 56 views
9

在Linux 2.6內核和NFSv3中,open("fname", O_CREAT|O_EXCL)有效嗎?目前規範open(2)系統調用文檔(http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html)說,一切都很好:open O_CREAT |在Linux上NFS的O_EXCL?

- O_EXCL 
    - ... 
     On NFS, O_EXCL is only supported when using NFSv3 or later on kernel 
     2.6 or later. In NFS environments where O_EXCL support is not 
     provided, programs that rely on it for performing locking tasks will 
     contain a race condition. Portable programs that want to perform 
     atomic file locking using a lockfile, and need to avoid reliance on NFS 
     support for O_EXCL, can ... 

這讀取,就好像所有的2.6內核都OK,但該男子頁changelog(CA後期內核2.6.23)開始顯示效力四年 2.6.0上線後,在過去的一兩年裏,網絡用戶詬病這種使用情況十分盛行。我想在RHEL 5(2.6.18)系統上使用這個設置,但是當它真正變得安全時我無法確定。有沒有人有明確的答案?

+0

有沒有在某處有一個編程問題? – Gabe 2010-08-04 14:57:21

+0

我在第一句話中儘可能多地表達意思。由於人們可以在C++標準庫中提出有關'std :: fstream :: fstream(char const *,ios_base :: openmode)'的問題,我希望C標準庫是開放的遊戲,即使對於非POSIX選項。 – Jeff 2010-08-04 15:37:54

+0

如果這是最初的擔憂,則附帶的文字已大幅減少以幫助清晰。 – Jeff 2010-08-04 16:42:07

回答

7

顯然,NFS人聲稱,任何從NFSv3的和Linux上2.6.5是OK。

http://nfs.sourceforge.net/#faq_d10

  • D10。我試圖使用flock()/ BSD鎖來鎖定多個客戶端上使用的文件,但文件被破壞。怎麼來的?
    • A. flock()/ BSD鎖僅在本地2.6.12之前的Linux NFS客戶端上起作用。使用fcntl()/ POSIX鎖確保文件鎖對其他客戶端可見。
    • 下面是一些序列化訪問NFS文件的方法。
      • 使用fcntl()/ POSIX鎖定API。這種類型的鎖定可通過NLM協議或通過NFSv4跨多個客戶端提供字節範圍鎖定。
      • 使用單獨的鎖定文件,並創建硬鏈接。請參閱creat(2)手冊頁的O_EXCL部分中的說明。
    • 值得注意的是,在早期的2.6內核之前,O_EXCL的創建在Linux NFS客戶端上不是原子的。不要使用O_EXCL在多個NFS客戶端之間創建並期望原子行爲,除非您運行的內核比更新2.6.5
    • ...