2013-01-15 55 views
0

如果我有一個大小爲5的文件,並且使用lseek來尋找位置10,然後使用read從此位置讀取1個字節,則讀取系統調用的返回值爲0. I在下列情況下想要知道lseek/read/write的返回值: 如果我試圖超過文件系統允許的最大文件大小,然後執行讀取操作。我們可以看看這個位置嗎?這是一個錯誤嗎?如果不是,如果我在這裏做一個讀取什麼是讀取的返回值? 0或-1?UNIX lseek /讀/寫行爲

+2

你試過了嗎? –

+1

'read'返回實際讀取的字節數。 0聽起來適合我。 – zneak

+1

或者有可能搜索本身可能會失敗,因此您只需在舊位置閱讀。但@Carl是對的,你應該嘗試一下,看看。 – paxdiablo

回答

3

,你被允許設置超出文件的末尾位置的POSIX specs for lseek()狀態:

的lseek的()函數應允許文件偏移設置超出了現有數據的末尾文件。

如果所得位置超出從lseek()返回的off_t可變類型的邊界只抱怨。似乎沒有指定的錯誤消息表明「超出了特定於進程的限制」或「超出了文件系統本身的容量」。


然而,試圖延長後與write()尋求可以返回EFBIG錯誤代碼,再次according to POSIX文件。最好的辦法是實際嘗試一下,看看其行爲是什麼,尤其是,因爲在所有情況下Linux不一定符合POSIX - 換句話說,符合POSIX的UNIX系統和Linux之間的行爲可能不同。


POSIX read() specs是相當堅定的關於會發生什麼:應通過當前檔案結尾出現

無數據傳送。如果起始位置在文件結束處或之後,則返回0。

因此,你應該得到的,因爲後面的零,顧名思義,如果你做了一個lseek()超出了文件系統的容量,你確實超出了文件的末尾(您不能創建更大的文件比文件系統允許)。