的read
和write
函數(以及親屬等send
,recv
,readv
,...)可以在其他返回一個數小於所請求的讀/寫長度的字節如果信號中斷(在某些情況下),以及或許也是如此。是否有一套明確的條件來解決這種情況何時會發生,還是主要取決於實施?下面是我感興趣的解答一些具體問題:什麼情況下可能發生短的讀/寫?
- 如果信號處理程序不中斷(
SA_RESTART
),這將導致之前被傳輸的任何數據信號處理函數返回後重新啓動中斷的IO操作。但是如果已經發生部分讀/寫並且信號處理程序不中斷,系統調用會立即以部分長度返回,還是會繼續嘗試讀取/寫入餘數? - 當數據量少於請求數量時,顯然讀取函數可以返回網絡,管道和終端文件描述符上的短讀取。但是,在這些情況下,由於緩衝區大小有限,寫入函數會返回短寫入,還是會阻塞,直到寫入所有數據?
我對所有三種標準要求的,通用的和Linux特定的行爲感興趣。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html – 2011-03-26 13:57:14
如果它阻塞,但是,是否有保證它不會返回短寫入? (除非由信號引起) – 2011-03-26 14:16:13
@R ..我不認爲有保證。如果我沒有犯錯,還有其他情況下寫入可能會失敗:例如,如果網卡在操作系統寫出一些數據時被移除,我認爲即使在這種情況下寫入也應該返回短字節。不確定這一點。我必須檢查我的網絡代碼,我現在沒有與我在一起。 – Heisenbug 2011-03-26 16:26:42