日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【网络编程】——connect函数遇见EINTR的处理

發布時間:2025/6/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【网络编程】——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 錯誤的時候,處理過程如下:

1 int check_conn_is_ok(socket_t sock) { 2 struct pollfd fd; 3 int ret = 0; 4 socklen_t len = 0; 5 6 fd.fd = sock; 7 fd.events = POLLOUT; 8 9 while ( poll (&fd, 1, -1) == -1 ) { 10 if( errno != EINTR ){ 11 perror("poll"); 12 return -1; 13 } 14 } 15 16 len = sizeof(ret); 17 if ( getsockopt (sock, SOL_SOCKET, SO_ERROR, 18 &ret, 19 &len) == -1 ) { 20 perror("getsockopt"); 21 return -1; 22 } 23 24 if(ret != 0) { 25 fprintf (stderr, "socket %d connect failed: %s\n", 26 sock, strerror (ret)); 27 return -1; 28 } 29 30 return 0; 31 }

  調用時如下:

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的处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。