socket程式的SIGPIPE問題 - Linux

Yuri avatar
By Yuri
at 2013-09-10T17:32

Table of Contents


hi

請問各位
我的程式會不斷的發送資料給client端
使用的是TCP/IP連線

但是我實驗發現 如果client端未依正常程序結束(例如跳電,拔網路線)...等
server端大約過5~6秒就會卡住
所有資料都送不出去了 這時唯有結束server端程式重啟才行

查了一下google 有提到SIGPIPE 說是在send的過程中如果client端斷線或是RST
這時候系統會拋出一個SIGPIPE的signal
預設的處理方式是結束terminal 這當然不是我想要的

然後有說可以用
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction( SIGPIPE, &sa, 0 );

用signal的函式讓SIGPIPE交給SIG_IGN處理
然後有提到sigaction函式是使用一次就永久有效
如果用signal(SIGPIPE, SIG_IGN); 則是只有一次效果

但是經過我交叉測試 不管我怎麼設 只要我手動把client端網路關掉
大約經過5~6秒後 server端就一定會卡住 動彈不得
新資料送不出去 client連線也連不進來


請問我該怎麼處理比較好呢
理想狀態是如果SIGPIPE 我就把那個connection close掉
至少server端系統要持續進行 不能終止或是卡住
只是要先偵測到SIGPIPE 因為靠send函式的return值無法觀察出這個connection是否已經壞掉了



求助各為了 謝謝











--
Tags: Linux

All Comments

Ivy avatar
By Ivy
at 2013-09-14T07:57
man 2 select
Margaret avatar
By Margaret
at 2013-09-16T02:53
我個人印象卡住的話要解的問題是blocking/nonblocking
Gary avatar
By Gary
at 2013-09-16T18:55
SIGPIPE只是其中一個要處理的問題,好像還要注意errno
Irma avatar
By Irma
at 2013-09-19T22:24
如果在solaris上的話errno又有thread safe的問題
Rachel avatar
By Rachel
at 2013-09-20T13:41
總之我記得上述曾經google過的keyword,但最後我放棄了~XD
Andrew avatar
By Andrew
at 2013-09-24T23:58
libevent~
Catherine avatar
By Catherine
at 2013-09-28T17:44
1F是正解,用select直接解決所有問題
其它方法不是不好,是沒有select這麼全面又易寫
Kama avatar
By Kama
at 2013-09-30T02:13
可是我現在用的就是select的方法耶
Charlotte avatar
By Charlotte
at 2013-10-04T11:01
send用的是send(fd, &buf, len, MSG_NOSIGNAL);
用MSG_NOSIGNAL這個flag是否會造成甚麼副作用呢
Blanche avatar
By Blanche
at 2013-10-07T22:25
你有根據 writefds 的 fd 是 FD_ISSET 再寫入嗎?
Wallis avatar
By Wallis
at 2013-10-11T21:09
those in writefds will be watched to see if a write
will not block
Caitlin avatar
By Caitlin
at 2013-10-15T15:18
我對於writefds沒有先FD_ISSET耶 因為FD_ISSET的功能
不是用來檢查"這個fd裡面是否有資料要讀取"的意思嗎?
Elma avatar
By Elma
at 2013-10-16T03:10
所以我對於發送給client端訊息的時候 沒有先FD_ISSET
Heather avatar
By Heather
at 2013-10-17T23:55
因為我的client端只有"正常斷線"的時候可以讀取到長度0
其他時候都不會傳送資料的
David avatar
By David
at 2013-10-20T11:54
我不是有推一段 man select 2 的英文片斷嗎?
Hedda avatar
By Hedda
at 2013-10-20T23:29
昨天我知道是因為send函式造成的block了

網樂通 kernel 2.6.32.59 upgrade

Adele avatar
By Adele
at 2013-09-09T16:27
wheezy for sh4 http://forum.cse.yzu.edu.tw/debian-sh4/ 目前持續開發中, 歡迎有興趣的人可以加入我們:) ※ 引述《suzuke (suzuke)》之銘言: : 有鑑於網樂通釋出的kernel source過於老舊, : 許多新的device都無法 ...

批次重新命名*.png to *2.png

Hedy avatar
By Hedy
at 2013-09-09T12:40
如題 我想要重新命名資料夾的所有檔案 *.png 重新命名成 *2.png 請問該command要怎麼下呢? 我只會加在檔名最後而已 ex: for i in $(ls); mv $i $i\2; done 結果會變成*2.png 謝謝 - ...

HackingThursday 固定聚會 (2013-09-12)

Kelly avatar
By Kelly
at 2013-09-09T12:07
通告網址: [http://www.hackingthursday.org/][1] * * * * 時間: 每週四晚上 19:30 至 22:00 ( 熱食供應至 20:00 ) * 地點: 伯朗咖啡 ( 建國店 ) * 地址: 台北市大安區建國南路一段 166 號 2 樓 * 鄰 ...

程式只能執行一次的問題

Cara avatar
By Cara
at 2013-09-09T10:45
請問 Linux 能否讓相同程式同時間只執行一個 不能執行多個? 感恩 - ...

請問一下關於nginx gzip模組

Delia avatar
By Delia
at 2013-09-09T00:01
上網查了一下 有文章寫jpeg因已壓縮過, 再使用gzip基本上沒有什麼反應 所以想請問一下 關於gzip模組對於jpeg與swf檔的壓縮情況,是否有顯著反應 我目前的設定如下 : gzip_types text/plain application/x-javascript image/jpeg ima ...