iOS----SIGPIPE信號終止進程

概念:

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后自動退出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容