2010-10-21 21 views
0

你能幫助我理解爲什麼它建議使用:如何管理EINTR錯誤號在sem_timedwait

while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR) 
    continue; // Restart when interrupted by handler 

(EINTR:調用被信號處理器中斷)

代替簡單地說:

s = sem_timedwait(&sem, &ts); 

在女巫的情況下,我必須管理EINTR?

回答

2

如果在執行系統調用期間捕獲到信號,則循環將導致系統調用重新啓動,因此它不會繼續執行下一個語句,除非系統調用已成功或失敗(與其他錯誤)。否則,當系統調用被信號處理程序中斷時,線程將繼續執行下一條語句。

例如,如果您想通過向線程發送特定信號來中止此sem_timedwait(),那麼您不希望無條件地重新啓動系統調用。相反,您可能需要標記操作已中止並清理。如果您有多個信號處理程序,信號處理程序可以設置一個標誌,在遇到EINTR時可以檢查該標誌以確定是否重新啓動系統調用。

這隻有在線程使用信號處理程序捕獲任何信號時才起作用,並且sigaction()SA_RESTART標誌未用於自動重新啓動任何中斷的系統調用。但是,如果您沒有使用任何信號處理程序,並且不打算讓您的代碼受到信號處理程序的影響,那麼使用該循環仍然是一個好習慣,以便即使您的代碼晚些時候它仍將繼續按預期工作與其他使用信號處理程序用於不相關目的的其他代碼在同一程序中使用。

+0

感謝您的回答,現在很明顯。 – 2010-10-22 08:06:37