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