概念:
SIGPIPE,當一個程序a調(diào)用send函數(shù)向一個服務(wù)A發(fā)送信號的數(shù)據(jù),服務(wù)A在接收數(shù)據(jù)的時候突然掛掉、無法接收數(shù)據(jù)、沒有接收者,那么內(nèi)核就會發(fā)送一個SIGPIPE信號,從而中斷進程,導(dǎo)致程序退出。
調(diào)用signal(SIGPIPE, SIG_IGN);
對一個已經(jīng)收到FIN包的socket調(diào)用read方法,
如果接收緩沖已空, 則返回0, 這就是常說的表示連接關(guān)閉. 但第一次對其調(diào)用write方法時, 如果發(fā)送緩沖沒問題, 會返回正確寫入(發(fā)送).
但發(fā)送的報文會導(dǎo)致對端發(fā)送RST報文, 因為對端的socket已經(jīng)調(diào)用了close, 完全關(guān)閉, 既不發(fā)送, 也不接收數(shù)據(jù). 所以,
第二次調(diào)用write方法(假設(shè)在收到RST之后), 會生成SIGPIPE信號, 導(dǎo)致進程退出.
為了避免進程退出, 可以捕獲SIGPIPE信號, 或者忽略它, 給它設(shè)置SIG_IGN信號處理函數(shù):
signal(SIGPIPE, SIG_IGN);
這樣, 第二次調(diào)用write方法時, 會返回-1, 同時errno置為SIGPIPE. 程序便能知道對端已經(jīng)關(guān)閉.
總結(jié)
signal(SIGPIPE, SIG_IGN)的作用就是防止程序收到SIGPIPE后自動退出。