[英]read from disk and EINTR
如果您讀取大量數據,是否有必要檢查errno == EINTR
? 我使用pread()
函數進行讀取。 在我所有的時間里,我從未見過EINTR
返回,但是我在網上看到了一些明確檢查它的代碼。
因此是否真的有必要檢查EINTR
並可能重復通話?
當系統調用由於您的進程收到信號而中斷時,將返回EINTR。 如果您的進程在內核中被阻塞,等待讀取完成,並且捕獲到信號,則可能會喚醒內核; 否則 , 可能會喚醒內核。 這取決於操作是否可中斷。 睡眠的I / O例程被喚醒,並有望將EINTR返回到用戶空間。
在內核返回用戶空間之前,它會檢查未決的信號。 如果有信號待處理,它將采取與該信號相關的操作。 可能的操作包括:將信號調度到信號處理程序,終止進程或忽略該信號。 假設這不會殺死您的進程和/或信號處理程序正常返回,則系統調用將返回EINTR。
如果您不期望這樣做,通常您希望再次嘗試該操作,但這也可以用作正常中止I / O操作的一種方式。 例如,alarm(2)可用於實現超時,如果I / O沒有及時完成,則SIGALRM會被傳遞出去。 在信號處理程序中,可以設置一個指示超時的標志,並且當您的讀取操作返回EINTR時,您可以檢查超時標志。
原因是-例如,在繁忙的系統上,讀取時可能會中斷。 因此,在桌面上您可能永遠看不到它。 在過載的服務器上,可以。
UNIX環境中高級編程的第5章-Stevens和Rago。 有完整的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.