2012-09-06 64 views
0

沒有設置爲EIO我有安裝我的系統上遠程磁盤使用NFS,我試圖用PWRITE()API寫上安裝遠程磁盤中的文件。錯誤而使用PWRITE()API

它不發生的每一次,但在某些情況下,在做I/O PWRITE()失敗,錯誤號設置爲EIO(輸入/輸出錯誤)。

能有人請解釋爲什麼發生在首位這個錯誤,是有什麼辦法可以糾正嗎?

感謝

+0

你有一個最小的測試程序(比如說,在隨機偏移寫隨機長度塊到一個固定大小的目標文件)表現出的問題驗證?通常'EIO'只是由於底層設備或文件系統存在錯誤(如描述符已關閉)或真正的讀/寫錯誤。在某些情況下'PWRITE()'可以依靠'lseek的()'(客戶端或服務器上),它是由兩個並行作家的衝突可能最終爲'errno' =='EIO'可行呢。通過一個小型測試用例,可以在兩個不同的客戶端上同時寫入同一個文件,您可以輕鬆驗證。 –

+0

是的,我只是在一個文件的隨機偏移位置進行I/O操作。但是現在只有一個線程正在使用pwrite()對掛載服務器上的文件執行I/O操作(對單個文件沒有併發寫入操作)。我相信文件描述符沒有關閉。它可能是NFS接口的問題嗎? – sam32

+0

可能是網絡問題? –

回答

0

從閱讀(壞的)經驗和寫入NFS基於文件,我瞭解到,你有一個很好的機會,通過簡單地重試失敗的I/O操作(read()write())來解決這個EIO左右。

同樣在NFS一個不能假設read()/write()做傳輸指定的數據量,所以這是好主意,要經常檢查有問題的功能有多少字節被轉移的返回值。

我看問題的基本NFS功能或NFS駕駛員的結果由內核處理的方式,所以我強烈認爲pread()/pwrite()表現出同樣的效果,因爲我使用read()/write()時親眼目睹。