關於SIGPIPE致使的程序退出

1.概述服務器

   當服務器close一個鏈接時,若client端接着發數據。根據TCP協議的規定,會收到一個RST響應,client再往這個服務器發送數據時,系統會發出一個SIGPIPE信號給進程,告訴進程這個鏈接已經斷開了,不要再寫了。又或者當一個進程向某個已經收到RST的socket執行寫操做是,內核向該進程發送一個SIGPIPE信號。該信號的缺省學位是終止進程,所以進程必須捕獲它以避免不情願的被終止。socket

根據信號的默認處理規則SIGPIPE信號的默認執行動做是terminate(終止、退出),因此client會退出。若不想客戶端退出能夠把 SIGPIPE設爲SIG_IGN進程

如:signal(SIGPIPE, SIG_IGN);
這時SIGPIPE交給了系統處理。it

服務器採用了fork的話,要收集垃圾進程,防止殭屍進程的產生,能夠這樣處理:
signal(SIGCHLD,SIG_IGN);
交給系統init去回收。
這裏子進程就不會產生殭屍進程了。cli

相關文章
相關標籤/搜索