多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

socket編程中的SIGPIPE信號

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

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

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

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

對一個已經(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)致進(jìn)程退出.

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

signal(SIGPIPESIG_IGN);

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


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

signal (SIGPIPE, SIG_IGN);

我的程序產(chǎn)生這個信號的原因是: 
client端通過 pipe 發(fā)送信息到server端后,就關(guān)閉client端, 這時server端,返回信息給 client 端時就產(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í)行被暫時掛起。當(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   

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

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 在线看福利片 | 刺激第一页720lu久久 | 亚洲国产精品a一区二区三区 | 丁香五月好婷婷深深爱 | 国产福利在线观看永久免费 | 中文字幕第10页 | 欧美在线观看视频一区 | 午夜视频网 | 国产精品网站 夜色 | 亚洲欧美一区二区三区蜜芽 | 激情综合五月天丁香婷婷 | 成人淫片免费视频95视频 | 欧美最猛性xxxxx亚洲精品 | 久久国产一级毛片一区二区 | 国产日韩精品一区二区在线观看播放 | 啄木乌欧美一区二区三区 | 666精品国产精品亚洲 | 麻豆久久精品免费看国产 | 欧美另类网 | 97理论三级九七午夜在线观看 | 在线观看视频免费播放 | 久久久久欧美激情 | 天天做夜夜做久久做狠狠 | 在线国产中文字幕 | 精品999视频 | 欧美18毛片 | 精品少妇一区二区三区视频 | 欧美亚洲综合另类成人 | 黄色免费在线网站 | 国产乱码精品一区二区三区四川 | 在线视频 一区二区 | japanese护士 | 4虎1515hh永久免费 | 网站免费视频 | 亚洲视频成人 | 日本www网站 | 国产在线乱码在线视频 | 欧美日韩久久毛片 | 亚洲三级黄色 | 69精品免费视频 | jizz免费视频 |