錯誤現象:(semop函數調用,strerror(errno)輸出結果) Interrupted system call 平臺:RedHat Linux
LINUX文檔關于EINTR的描述是這樣子的: While blocked in this system call, the process caught a signal. UNIX文檔[IEEE Std 1003.1-2008]關于EINTR的描述是這樣子的: The semop() function was interrupted by a signal.
該錯誤我在GOOGLE上搜了一些貼子,有一位仁兄曾說過:由于死鎖導致 因為信號量本身就是防止出現死鎖。我特意做了一下實驗,使用一個互斥變量和一個信號量,以及兩個信號量,以不同順序,以實現死鎖,可是系統并未出現我期望的“Interrupted system call”,而只是一味的等待。
今天在看《UNIX網絡編程第1卷 套接口API》時,看到了這樣的一句話,讓我理解了為什么會出現這個錯誤,原文如下: “適用于慢系統調用的基本規則是:當阻塞于某個慢系統調用的一個進程捕獲某個信號且相應信號處理函數返回時,該系統調用可能返回一個EINTR錯誤。有些內核自動重啟某些被中斷的系統調用?!?BR>在這里,慢系統調用(slow system call)在書中是指類似accept之類的引起阻塞的函數,而上文討論過的semop函數,我想應該也是這一類的,所以當現現EINTR信號時,該系統調用被中斷,并返回錯誤,錯誤號為:EINTR,我們就可以從這個錯誤號來重新啟動我們的系統調用。