Linux-Kernel

被信號打斷後可以讀取系統呼叫體驗短計數嗎?

  • October 2, 2020

假設我呼叫read讀取 1000 個字節,並且什麼時候read讀取第 501 個字節,然後一個信號中斷它,那麼read返回 500 嗎?

根據文件的類型(磁碟、套接字、管道、終端)和信號的時間,它至少可以做三件事中的任何一件。

(a) 信號可能在任何數據傳輸之前到達,在這種情況下 read() 返回 -1,並將 errno 設置為 EINTR。呼叫者應該明確地重複 read()。

(b) 信號可能會被推遲到傳輸完成,然後正常返回,可能是在呼叫信號處理程序之後。

(c) 讀取可能返回短計數,這不是錯誤。這也可能發生在文件末尾,或者目前沒有更多可用資訊時(例如在管道或套接字上),以及信號中斷傳輸時。呼叫者應該處理短輸入,或者通過處理可變長度部分中的數據,或者通過額外的 read() 呼叫來完成原始傳輸的意圖。

引用自:https://unix.stackexchange.com/questions/612574