IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    关于SIGPIPE

    Qiang发表于 2010-12-30 09:04:12
    love 0

    最近在做网络编程,有时候程序会挂掉,调试发现程序收到了SIGPIPE,造成这个信号的原因可以自行google,因为程序收到SIGPIPE的默认动作是终止程序,所以我们需要对这个信号进行屏蔽。

    在多进程的环境下,下面代码可以解决问题:

    ?View Code C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     struct sigaction sa;
     sa.sa_handler = SIG_IGN;
     sa.sa_flags = 0;
     sigemptyset(&sa.sa_mask);
     sigaddset(&sa.sa_mask,SIGPIPE);
     if (sigaction(SIGPIPE, &sa, 0)) {
      perror("failed to ignore SIGPIPE");
      exit(-1);
     }

    如果是在多线程的环境下,在创建线程之前需要:

    ?View Code C
    1
    2
    3
    4
    5
    6
    
     sigset_t signal_mask;
     sigemptyset(&signal_mask);
     sigaddset(&signal_mask, SIGPIPE);
     if ( pthread_sigmask(SIG_BLOCK, &signal_mask, NULL) ) {
      printf("block sigpipe error\n");
     }


沪ICP备19023445号-2号
友情链接