第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何防止SIGPIPE(或妥善處理)

如何防止SIGPIPE(或妥善處理)

C
翻閱古今 2019-07-04 12:36:25
如何防止SIGPIPE(或妥善處理)我有一個小型服務器程序,它接受TCP或本地UNIX套接字上的連接,讀取一個簡單的命令,并根據(jù)命令發(fā)送答復。問題是,客戶端有時可能對答案不感興趣,并且提前退出,因此向該套接字寫入將導致SIGPIPE并使我的服務器崩潰。防止墜機的最佳方法是什么?有沒有辦法檢查另一邊是否還在讀?(select()在這里似乎不起作用,因為它總是說套接字是可寫的)?;蛘呶覒撚靡粋€處理程序捕獲SIGPIPE并忽略它嗎?
查看完整描述

3 回答

?
www說

TA貢獻1775條經(jīng)驗 獲得超8個贊

您通常希望忽略SIGPIPE并在代碼中直接處理錯誤。這是因為C中的信號處理程序對它們所能做的事情有很多限制。

實現(xiàn)此操作的最可移植的方法是設置SIGPIPE處理程序SIG_IGN..這將防止任何套接字或管道寫入導致SIGPIPE信號。

忽略SIGPIPE信號,使用以下代碼:

signal(SIGPIPE, SIG_IGN);

如果您使用的是send()調用,另一個選項是使用MSG_NOSIGNAL選項,這將使SIGPIPE在每次通話的基礎上停止行為。注意,并非所有操作系統(tǒng)都支持MSG_NOSIGNAL旗子。

最后,您還可以考慮SO_SIGNOPIPE可以設置的套接字標志setsockopt()在一些操作系統(tǒng)上。這樣可以防止SIGPIPE由于只寫到它所設置的套接字而引起的。


查看完整回答
反對 回復 2019-07-04
?
楊魅力

TA貢獻1811條經(jīng)驗 獲得超6個贊

另一種方法是更改套接字,這樣它就不會在write()上生成SIGPIPE。這在庫中更為方便,在庫中,您可能不希望為SIGPIPE設置全局信號處理程序。

在大多數(shù)基于BSD的(MacOS,F(xiàn)reeBSD.)系統(tǒng),(假設您使用的是C/C+),您可以使用以下方法來完成:

int set = 1;setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

這樣,將返回EPIPE,而不是生成SIGPIPE信號。


查看完整回答
反對 回復 2019-07-04
  • 3 回答
  • 0 關注
  • 1954 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號