Linux-Kernel
被信號打斷後可以讀取系統呼叫體驗短計數嗎?
假設我呼叫
read
讀取 1000 個字節,並且什麼時候read
讀取第 501 個字節,然後一個信號中斷它,那麼read
返回 500 嗎?
根據文件的類型(磁碟、套接字、管道、終端)和信號的時間,它至少可以做三件事中的任何一件。
(a) 信號可能在任何數據傳輸之前到達,在這種情況下 read() 返回 -1,並將 errno 設置為 EINTR。呼叫者應該明確地重複 read()。
(b) 信號可能會被推遲到傳輸完成,然後正常返回,可能是在呼叫信號處理程序之後。
(c) 讀取可能返回短計數,這不是錯誤。這也可能發生在文件末尾,或者目前沒有更多可用資訊時(例如在管道或套接字上),以及信號中斷傳輸時。呼叫者應該處理短輸入,或者通過處理可變長度部分中的數據,或者通過額外的 read() 呼叫來完成原始傳輸的意圖。