2011-03-26 26 views
6

readwrite函數(以及親屬等sendrecvreadv,...)可以在其他返回一個數小於所請求的讀/寫長度的字節如果信號中斷(在某些情況下),以及或許也是如此。是否有一套明確的條件來解決這種情況何時會發生,還是主要取決於實施?下面是我感興趣的解答一些具體問題:什麼情況下可能發生短的讀/寫?

  • 如果信號處理程序不中斷(SA_RESTART),這將導致之前被傳輸的任何數據信號處理函數返回後重新啓動中斷的IO操作。但是如果已經發生部分讀/寫並且信號處理程序不中斷,系統調用會立即以部分長度返回,還是會繼續嘗試讀取/寫入餘數?
  • 當數據量少於請求數量時,顯然讀取函數可以返回網絡,管道和終端文件描述符上的短讀取。但是,在這些情況下,由於緩衝區大小有限,寫入函數會返回短寫入,還是會阻塞,直到寫入所有數據?

我對所有三種標準要求的,通用的和Linux特定的行爲感興趣。

回答

2

對於你的第二個問題:寫可以返回短寫在有限的緩衝區大小,如果它是非阻塞

+0

http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html – 2011-03-26 13:57:14

+0

如果它阻塞,但是,是否有保證它不會返回短寫入? (除非由信號引起) – 2011-03-26 14:16:13

+0

@R ..我不認爲有保證。如果我沒有犯錯,還有其他情況下寫入可能會失敗:例如,如果網卡在操作系統寫出一些數據時被移除,我認爲即使在這種情況下寫入也應該返回短字節。不確定這一點。我必須檢查我的網絡代碼,我現在沒有與我在一起。 – Heisenbug 2011-03-26 16:26:42

1

有可能會導致對常規文件寫回到短尺寸至少有一個標準條件:

如果一個寫()請求多個字節 被寫入比有空間(對於 例如,[XSI]文件大小限制的過程或 介質物理末端的 ),僅作爲 有很多字節,應該寫出來十。例如,對於 示例,假設在達到 限制之前,文件中有多餘空間可存儲20個字節。寫入512字節將使 返回20.下一次寫入非零字節數將導致 故障返回(除了下面指出的 )。

相關問題