美文网首页
SIG信号捕获

SIG信号捕获

作者: 生产八哥 | 来源:发表于2021-07-20 16:11 被阅读0次

    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,使客户端不执行默认操作,即不退出

    相关文章

      网友评论

          本文标题:SIG信号捕获

          本文链接:https://www.haomeiwen.com/subject/hvzwyltx.html