linux網絡通訊程序無提示自動退出——SIGPIPE信號退出

問題:

最近寫了一個網絡通訊程序,在局域網內調試測試都沒有出問題,但是一拿到真實環境就總是出錯,異常自動退出

最後根據strace發現,是因爲sigpipe信號給結束掉的。


關於sigpipe信號:


產生原因:

當服務器close一個連接時,若client端接着發數據。根據TCP協議的規定,會收到一個RST響應,client再往這個服務器發送數據時,系統會發出一個SIGPIPE信號給進程,告訴進程這個連接已經斷開了,不要再寫了。


信號默認處理:

根據信號的默認處理規則SIGPIPE信號的默認執行動作是terminate(終止、退出),所以client會退出。若不想客戶端退出可以把SIGPIPE設爲SIG_IGN。


解決方式:

程序中加signal(SIGPIPE,SIG_IGN);把這個信號扔給系統處理。

爲了防止殭屍進程,可以把子程序通過設置signal(SIGCHLD,SIG_IGN);來交給系統init來回收。


溫馨提示:

所以大家在開發網絡通訊程序的時候一定要注意這個信號的處理。切記



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章