signal(SIGPIPE, SIG_IGN);
TCP是全雙工的信道, 可以看作兩條單工信道, TCP連接兩端的兩個端點各負責一條. 當對端調用close時, 雖然本意是關閉整個兩條信道,?
但本端只是收到FIN包.?
按照TCP協議的語義, 表示對端只是關閉了其所負責的那一條單工信道, 仍然可以繼續接收數據. 也就是說, 因為TCP協議的限制,?
一個端點無法獲知對端的socket是調用了close還是shutdown.
這句不太準確,雖然本端無法知道對端是close還是shutdown(S,SHUT_WR),但是如果對端是close并且socket描述符的使用計數減為0的話,
那么實際對端是關閉了兩個信道。原因,實際下面已經講了,對端如果close,相當于shutdow(S,SHUT_BOTH),本端如果再write的話,就會收到
RST的。
對一個已經收到FIN包的socket調用read方法,?
如果接收緩沖已空, 則返回0, 這就是常說的表示連接關閉. 但第一次對其調用write方法時, 如果發送緩沖沒問題, 會返回正確寫入(發送).?
但發送的報文會導致對端發送RST報文, 因為對端的socket已經調用了close, 完全關閉, 既不發送, 也不接收數據. 所以,?
第二次調用write方法(假設在收到RST之后), 會生成SIGPIPE信號, 導致進程退出.
為了避免進程退出,?可以捕獲SIGPIPE信號, 或者忽略它, 給它設置SIG_IGN信號處理函數:
signal(SIGPIPE,?SIG_IGN);
這樣, 第二次調用write方法時, 會返回-1,?同時errno置為SIGPIPE. 程序便能知道對端已經關閉.
總結:
? ?實際這個函數的目的就是防止程序收到SIGPIPE后自動退出
總結
以上是生活随笔為你收集整理的signal(SIGPIPE, SIG_IGN);的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车“一夜”回到80年代!俄罗斯电动汽车
- 下一篇: OLED面板的iPad有戏:三星正为其建