我正在閱讀「UNIX系統編程」一書,並介紹了以下幾點。爲什麼如果出現任何信號,C庫函數就會失敗
無論何時調用C庫函數(例如close()
),最好檢查EINTR
錯誤代碼,因爲如果進程收到任何信號,庫函數可能會失敗。如果發生了EINTR
錯誤,則應重新啓動相應的C庫調用。
while ((close(fd) == -1) && errno == EINTR); // close is restarted if it fails with EINTR error.
問題:爲什麼庫函數在獲取信號時會失敗? 收到信號後,調用相應的處理程序。處理程序完成後,庫函數不能從它停止的位置繼續?
在UNIX Hater's Handbook中,有一個軼事應該根據它來判斷,但是UNIX和相關標準的制定者卻選擇將它轉儲到用戶的膝上,因爲它使操作系統更易於實現。 – Medinoc
注意:close()不是一個庫函數,而是一個(包裝)系統調用。系統調用可能會失敗。 (由於爭議不佳,資源短缺,(假設)種族/衝突,......)自動重啓並不總是一種選擇,在某些情況下,主叫方應該自行採取行動。 – wildplasser