Linux下semop等待信號時出現(xiàn)Interrupted System Call錯誤(EINTR)解決方法
錯誤現(xiàn)象:(semop函數(shù)調(diào)用,strerror(errno)輸出結(jié)果)
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.
這樣的兩句話如果關從字面上理解的話,就是在semop等待的過程中出現(xiàn)INTR信號。
可是,錯誤的出現(xiàn)需要解決,錯誤的原因一般是由程序員寫的代碼造成的。
經(jīng)過調(diào)試輸出定位問題原因,終于找到了問題所有:
當semop正在等待資源時,如果這個時候,該進程中某線程使用system調(diào)用SHELL函數(shù)時,semop立即返回,并且錯誤號為EINTR,錯誤信息如上。別看這樣一個小問題,在我的系統(tǒng)中,由于使用了多種手段來實現(xiàn)IPC(進程內(nèi)通信),要打到原因是由于一個system的調(diào)用就不是那么簡單了。
[因為網(wǎng)絡上這個問題解決方案暫時沒有找到,希望能給他人幫助]
該錯誤我在GOOGLE上搜了一些貼子,有一位仁兄曾說過:由于死鎖導致
因為信號量本身就是防止出現(xiàn)死鎖。我特意做了一下實驗,使用一個互斥變量和一個信號量,以及兩個信號量,以不同順序,以實現(xiàn)死鎖,可是系統(tǒng)并未出現(xiàn)我期望的“Interrupted system call”,而只是一味的等待。
今天在看《UNIX網(wǎng)絡編程第1卷 套接口API》時,看到了這樣的一句話,讓我理解了為什么會出現(xiàn)這個錯誤,原文如下:
“適用于慢系統(tǒng)調(diào)用的基本規(guī)則是:當阻塞于某個慢系統(tǒng)調(diào)用的一個進程捕獲某個信號且相應信號處理函數(shù)返回時,該系統(tǒng)調(diào)用可能返回一個EINTR錯誤。有些內(nèi)核自動重啟某些被中斷的系統(tǒng)調(diào)用。”
在這里,慢系統(tǒng)調(diào)用(slow system call)在書中是指類似accept之類的引起阻塞的函數(shù),而上文討論過的semop函數(shù),我想應該也是這一類的,所以當現(xiàn)現(xiàn)EINTR信號時,該系統(tǒng)調(diào)用被中斷,并返回錯誤,錯誤號為:EINTR,我們就可以從這個錯誤號來重新啟動我們的系統(tǒng)調(diào)用。
上一篇:基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討
欄 目:C語言
下一篇:深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)
本文標題:Linux下semop等待信號時出現(xiàn)Interrupted System Call錯誤(EINTR)解決方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4476.html
您可能感興趣的文章
- 01-10大數(shù)(高精度數(shù))模板(分享)
- 01-10深入解析Linux下\r\n的問題
- 01-10Linux線程管理必備:解析互斥量與條件變量的詳解
- 01-10Linux C 獲取進程退出值的實現(xiàn)代碼
- 01-10解析Linux下的時間函數(shù):設置以及獲取時間的方法
- 01-10深入探討linux下進程的最大線程數(shù)、進程最大數(shù)、進程打開的文
- 01-10基于linux下獲取時間函數(shù)的詳解
- 01-10linux c 查找使用庫的cflags與libs的方法詳解
- 01-10深入sizeof的使用詳解
- 01-10深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10delphi制作wav文件的方法