【网络编程】——connect函数遇见EINTR的处理
最近在公司項目中突然報錯如下 “connect: Interrupted system call”, 經過查找代碼發現是在創建 socket 中執行了 connect 函數失敗導致。上網查閱資料發現這是 信號中斷EINTR 與 慢系統調用 的問題。
慢系統調用:可能永遠阻塞的系統調用。
EINTR說明:如果進程在一個慢系統調用(slow system call)中阻塞時,當捕獲到某個信號且相應信號處理函數返回時,這個系統調用被中斷,調用返回錯誤,設置errno為EINTR(相應的錯誤描述為“Interrupted system call”)。
在博客?http://blog.csdn.net/benkaoya/article/details/17262053 ?信號中斷 與 慢系統調用?有詳細介紹。
那么針對 EINTR 錯誤應該如何處理,或者如何規避這類問題。 建議查看此鏈接?http://www.madore.org/~david/computers/connect-intr.html
以下給出一些常用的處理方法:
◆ 人為重啟被中斷的系統調用
◆ 安裝信號時設置 SA_RESTART屬性(該方法對有的系統調用無效)
◆? 忽略信號(讓系統不產生信號中斷)
人為重啟被中斷的系統調用
人為當碰到EINTR錯誤的時候,有一些可以重啟的系統調用要進行重啟,而對于有一些系統調用是不能夠重啟的。例如:accept、read、write、select、和open之類的函數來說,是可以進行重啟的。不過對于套接字編程中的connect函數我們是不能重啟的,若connect函數返回一個EINTR錯誤的時候,我們不能再次調用它,否則將立即返回一個錯誤。針對connect不能重啟的處理方法是,必須調用select來等待連接完成。
對于非 connect 函數可以嘗試使用重新執行系統調用的方法。
對于 connect 函數出現 EINTR 錯誤的時候,處理過程如下:
調用時如下:
if(connnect()) {if(errno == EINTR) {if(check_conn_is_ok() < 0) {perror();return -1;}else {printf("connect is success!\n");}}else {perror("connect");return -1;} }?
總結
以上是生活随笔為你收集整理的【网络编程】——connect函数遇见EINTR的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学会这几个公式技巧,瞬间你就是高手
- 下一篇: 改善程序代码质量的一些技巧