socket編程中的SIGPIPE訊號

來源:互聯網
上載者:User

標籤:linux   tcp   socket   訊號   sigpipe   

我寫了一個伺服器程式,在Linux下測試,然後用C++寫了用戶端用千萬層級數量的短連結進行壓力測試.  但是伺服器總是莫名退出,沒有core檔案.

最後問題確定為, 對一個對端已經關閉的socket調用兩次write, 第二次將會產生SIGPIPE訊號, 該訊號預設結束進程.

具體的分析可以結合TCP的"四次握手"關閉. TCP是全雙工系統的通道, 可以看作兩條單工通道, TCP串連兩端的兩個端點各負責一條. 當對端調用close時, 雖然本意是關閉整個兩條通道, 但本端只是收到FIN包. 按照TCP協議的語義, 表示對端只是關閉了其所負責的那一條單工通道, 仍然可以繼續接收資料. 也就是說, 因為TCP協議的限制, 一個端點無法獲知對端的socket是調用了close還是shutdown.

對一個已經收到FIN包的socket調用read方法, 如果接收緩衝已空, 則返回0, 這就是常說的表示串連關閉. 但第一次對其調用write方法時, 如果發送緩衝沒問題, 會返回正確寫入(發送). 但發送的報文會導致對端發送RST報文, 因為對端的socket已經調用了close, 完全關閉, 既不發送, 也不接收資料. 所以, 第二次調用write方法(假設在收到RST之後), 會產生SIGPIPE訊號, 導致進程退出.

為了避免進程退出, 可以捕獲SIGPIPE訊號, 或者忽略它, 給它設定SIG_IGN訊號處理函數:

signal(SIGPIPE, SIG_IGN);

這樣, 第二次調用write方法時, 會返回-1, 同時errno置為SIGPIPE. 程式便能知道對端已經關閉.


在linux下寫socket的程式的時候,如果嘗試send到一個disconnected socket上,就會讓底層拋出一個SIGPIPE訊號。
這個訊號的預設處理方法是退出進程,大多數時候這都不是我們期望的。因此我們需要重載這個訊號的處理方法。調用以下代碼,即可安全的屏蔽SIGPIPE:

signal (SIGPIPE, SIG_IGN);

我的程式產生這個訊號的原因是: 
client端通過 pipe 發送資訊到server端後,就關閉client端, 這時server端,返回資訊給 client 端時就產生Broken pipe 訊號了,伺服器就會被系統結束了。


對於產生訊號,我們可以在產生訊號前利用方法 signal(int signum, sighandler_t handler) 設定訊號的處理。如果沒有調用此方法,系統就會調用預設處理方法:中止程式,顯示提示資訊(就是我們經常遇到的問題)。我們可以調用系統的處理方法,也可以自訂處理方法。 

系統裡邊定義了三種處理方法: 
(1)SIG_DFL訊號專用的預設動作:
  (a)如果預設動作是暫停線程,則該線程的執行被暫時掛起。當線程暫停期間,發送給線程的任何附加訊號都不交付,直到該線程開始執行,但是SIGKILL除外。
  (b)把掛起訊號的訊號動作設定成SIG_DFL,且其預設動作是忽略訊號 (SIGCHLD)。
(2)SIG_IGN忽略訊號
  (a)該訊號的交付對線程沒有影響
  (b)系統不允許把SIGKILL或SIGTOP訊號的動作設定為SIG_DFL
3)SIG_ERR   

項目中我調用了signal(SIGPIPE, SIG_IGN), 這樣產生  SIGPIPE 訊號時就不會中止程式,直接把這個訊號忽略掉。

socket編程中的SIGPIPE訊號

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.