日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > socket編程中的SIGPIPE信號

socket編程中的SIGPIPE信號

來源:程序員人生   發(fā)布時(shí)間:2014-09-29 15:22:20 閱讀次數(shù):2681次

我寫了一個(gè)服務(wù)器程序,在Linux下測試,然后用C++寫了客戶端用千萬級別數(shù)量的短鏈接進(jìn)行壓力測試.  但是服務(wù)器總是莫名退出,沒有core文件.

最后問題確定為, 對一個(gè)對端已經(jīng)關(guān)閉的socket調(diào)用兩次write, 第二次將會生成SIGPIPE信號, 該信號默認(rèn)結(jié)束進(jìn)程.

具體的分析可以結(jié)合TCP的"四次握手"關(guān)閉. TCP是全雙工的信道, 可以看作兩條單工信道, TCP連接兩端的兩個(gè)端點(diǎn)各負(fù)責(zé)一條. 當(dāng)對端調(diào)用close時(shí), 雖然本意是關(guān)閉整個(gè)兩條信道, 但本端只是收到FIN包. 按照TCP協(xié)議的語義, 表示對端只是關(guān)閉了其所負(fù)責(zé)的那一條單工信道, 仍然可以繼續(xù)接收數(shù)據(jù). 也就是說, 因?yàn)門CP協(xié)議的限制, 一個(gè)端點(diǎn)無法獲知對端的socket是調(diào)用了close還是shutdown.

對一個(gè)已經(jīng)收到FIN包的socket調(diào)用read方法, 如果接收緩沖已空, 則返回0, 這就是常說的表示連接關(guān)閉. 但第一次對其調(diào)用write方法時(shí), 如果發(fā)送緩沖沒問題, 會返回正確寫入(發(fā)送). 但發(fā)送的報(bào)文會導(dǎo)致對端發(fā)送RST報(bào)文, 因?yàn)閷Χ说膕ocket已經(jīng)調(diào)用了close, 完全關(guān)閉, 既不發(fā)送, 也不接收數(shù)據(jù). 所以, 第二次調(diào)用write方法(假設(shè)在收到RST之后), 會生成SIGPIPE信號, 導(dǎo)致進(jìn)程退出.

為了避免進(jìn)程退出, 可以捕獲SIGPIPE信號, 或者忽略它, 給它設(shè)置SIG_IGN信號處理函數(shù):

signal(SIGPIPESIG_IGN);

這樣, 第二次調(diào)用write方法時(shí), 會返回-1, 同時(shí)errno置為SIGPIPE. 程序便能知道對端已經(jīng)關(guān)閉.


linux下寫socket的程序的時(shí)候,如果嘗試send到一個(gè)disconnected socket上,就會讓底層拋出一個(gè)SIGPIPE信號。
這個(gè)信號的缺省處理方法是退出進(jìn)程,大多數(shù)時(shí)候這都不是我們期望的。因此我們需要重載這個(gè)信號的處理方法。調(diào)用以下代碼,即可安全的屏蔽SIGPIPE

signal (SIGPIPE, SIG_IGN);

我的程序產(chǎn)生這個(gè)信號的原因是: 
client端通過 pipe 發(fā)送信息到server端后,就關(guān)閉client端, 這時(shí)server端,返回信息給 client 端時(shí)就產(chǎn)生Broken pipe 信號了,服務(wù)器就會被系統(tǒng)結(jié)束了。


對于產(chǎn)生信號,我們可以在產(chǎn)生信號前利用方法 signal(int signum, sighandler_t handler) 設(shè)置信號的處理。如果沒有調(diào)用此方法,系統(tǒng)就會調(diào)用默認(rèn)處理方法:中止程序,顯示提示信息(就是我們經(jīng)常遇到的問題)。我們可以調(diào)用系統(tǒng)的處理方法,也可以自定義處理方法。 

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

項(xiàng)目中我調(diào)用了signal(SIGPIPESIG_IGN), 這樣產(chǎn)生  SIGPIPE 信號時(shí)就不會中止程序,直接把這個(gè)信號忽略掉。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 精品成人一区二区三区 | 一区二区三区久久久 | 精品国产91乱码一区二区三区 | 国产伦精品一区 | 国产精品美女 | 1000部精品久久久久久久久 | 中文字幕一区二区三 | 欧美成人午夜电影 | 91亚洲视频 | 欧美日韩一区二区三区在线视频 | 成人免费视频播放器 | 狠狠爱成人| 国产成人久久精品麻豆二区 | 日韩免费视频一区二区 | 国产女人成人精品a区 | 精品午夜一区二区 | 国产精品久久久久久久久 | 在线观看日韩一区 | 狠狠v欧美v日韩v亚洲ⅴ | 99精品免费 | www.嫩草影院 | 亚洲成人av免费在线观看 | 看一级黄色片 | 999久久久精品视频 国产第91页 | 国产精品一区在线播放 | 在线观看1区 | 日本亚洲精品成人欧美一区 | 久久国产麻豆 | 91精品国产色综合久久不卡98口 | 区美毛片| 最近中文字幕免费 | 欧美日韩性生活视频 | 免费在线黄网 | 国产毛片一区 | 又爽又大又黄a级毛片在线视频 | 99精品视频一区二区 | 国产精品一二区 | 亚洲一区在线免费 | 国产在线播放网址 | 九九九九九国产 | 日韩一级片 |