2014-12-06 92 views
0

如果讀取海量數據,是否需要檢查errno == EINTR?我使用pread()函數來讀取。在我所有的時間裏,我從未見過EINTR返回,但我已經看到一些代碼在線,它明確檢查它。從磁盤讀取和EINTR

所以真的有必要檢查EINTR並可能重複呼叫?

回答

0

原因是 - 例如,在繁忙的系統上,可能在讀取時產生中斷。 因此,在你的桌面上你可能永遠都看不到它。在超載的服務器上,您可以。在UNIX環境下高級編程的第5章 - Stevens和Rago。有一個完整的解釋。

1

當系統調用因進程接收信號而中斷時,返回EINTR。如果你的進程在內核被阻塞,等待讀取完成,並且一個信號被捕獲,則這個可能會在內核中喚醒;這取決於操作是否可中斷。休眠的I/O例程被喚醒,預計將EINTR返回到用戶空間。

就在內核返回到用戶空間之前,它檢查未決信號。如果信號未決,它將採取與該信號相關的操作。可能的操作包括:將信號發送到信號處理程序,終止進程或忽略信號。假設這不會消除你的進程和/或你的信號處理程序正常返回,系統調用將返回EINTR。

如果您不期待這樣,您通常需要再次嘗試該操作,但這也可以用作正常中止I/O操作的方式。例如,alarm(2)可用於實現超時,如果I/O未及時完成,則會發送SIGALRM。在你的信號處理程序中,你可以設置一個標誌來指示超時,當你的讀操作返回EINTR時,你可以檢查你的超時標誌。