Socket 編程時候遇到的Broken pipe問題__編程

來源:互聯網
上載者:User

   昨天有個程式除了問題,調試的時候發現是在SOCKET通訊的時候對方關閉串連的情況下出現broken pipe錯誤。在網上搜尋了一番,別人解釋原因是向已經關閉串連的SOCKET管道寫入資料造成的,但是我的程式只是在對方關閉的時候繼續RECV,難道 RECV也會向管道寫入資料,這個問題以後再研究吧。

    知道了問題就好辦了。UNIX的系統是採用訊號機制向進程通知這種系統錯誤的,13 SIGPIPE 的預設操作是Exit,所以在程式裡面寫一個自己的訊號處理函數,不讓進程退出就OK。不過值得注意的是在截獲一次訊號以後,系統會把訊號處理又恢複到默 認狀態,所以需要再次設定。另外,對於多線程,我是在主線程裡面做的訊號處理,其他線程沒有做,但是我理解訊號是發給進程的,所以應該只要有一個線程處理 了訊號就可以。

源碼:

void InitSignal(void);
void handle_signal(int s) ;

/*初始化時及每次處理完時調用*/
void InitSignal(void)
{
signal(SIGPIPE,handle_signal);
}
/*訊號處理函數*/
void handle_signal(int s)
{
InitSignal();
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.