main.m里的SIG信號捕獲
main.m有如下代碼
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGPIPE, &sa, NULL) < 0)
{
print("cannot ignore SIGPIPE");
return -1;
}
可能部分人不是很明確這塊代碼的意義漾月,之前工作時遇到過一種崩潰领迈,好像是socket長連接導致的crash
當服務器close一個連接時压彭,若client端接著發(fā)數(shù)據(jù)运翼,根據(jù)TCP協(xié)議的規(guī)定双谆,會收到一個RST響應壳咕,client再往這個服務器發(fā)送數(shù)據(jù)時,系統(tǒng)會發(fā)出一個SIGPIPE信號給進程顽馋,告訴進程這個連接已經(jīng)斷開谓厘,不要再寫了。而根據(jù)信號的默認處理規(guī)則趣避,SIGPIPE信號的默認執(zhí)行動作是terminate(終止庞呕、退出),所以client會退出。
所以蘋果建議這類信號不用處理住练。
解決方案
切換到后臺時地啰,關閉長連接和管道,回到前臺重新創(chuàng)建
使用signal(SIGPIPE讲逛、SIG_IGN),將SIGPIP交給系統(tǒng)處理亏吝,這么做將SIGPIPE設為SIG_IGN,使客戶端不執(zhí)行默認操作盏混,即不退出