簡體   English   中英

從磁盤和EINTR讀取

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM