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端接着发数据,根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开,不要再写了。而根据信号的默认处理规则,SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。
所以苹果建议这类信号不用处理。
解决方案
切换到后台时,关闭长连接和管道,回到前台重新创建
使用signal(SIGPIPE、SIG_IGN),将SIGPIP交给系统处理,这么做将SIGPIPE设为SIG_IGN,使客户端不执行默认操作,即不退出
网友评论