SIGPIPE信號解析

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

Linux下測試,而後用C++寫了客戶端用千萬級別數量的短連接進行壓力測試.  可是服務器老是莫名退出,沒有core文件.
測試

signal(SIGPIPESIG_IGN);spa

個人程序產生這個信號的緣由是: 
client端經過 pipe 發送信息到server端後,就關閉client端, 這時server端,返回信息給 client 端時就產生Broken pipe 信號了,服務器就會被系統結束了。
.net

對於產生信號,咱們能夠在產生信號前利用方法 signal(int signum, sighandler_t handler) 設置信號的處理。若是沒有調用此方法,系統就會調用默認處理方法:停止程序,顯示提示信息(就是咱們常常遇到的問題)。咱們能夠調用系統的處理方法,也能夠自定義處理方法。 

系統裏邊定義了三種處理方法: 
(1)SIG_DFL信號專用的默認動做:
  (a)若是默認動做是暫停線程,則該線程的執行被暫時掛起。當線程暫停期間,發送給線程的任何附加信號都不交付,直到該線程開始執行,可是SIGKILL除外。
  (b)把掛起信號的信號動做設置成SIG_DFL,且其默認動做是忽略信號 (SIGCHLD)。
(2)SIG_IGN忽略信號
  (a)該信號的交付對線程沒有影響
  (b)系統不容許把SIGKILL或SIGTOP信號的動做設置爲SIG_DFL
3)SIG_ERR   

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

相關文章
相關標籤/搜索