+ -
当前位置:首页 → 问答吧 → sigaction疑问??

sigaction疑问??

时间:2010-07-26

来源:互联网

要是父进程创建n个子进程。
......
  sa.sa_handler = chld_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags=0;
    sigaction(SIGCHLD,&sa,NULL);
......
这样写就能捕获所有的子进程退出时产生的SIGCHLD

作者: kanhfshiys   发布时间: 2010-07-26

对吧

作者: rain_fish   发布时间: 2010-07-26

  1. #include <sys/types.h>  /* 在任何其它 sys 下的头文件之前引用这个头文件 */
  2.      #include <sys/wait.h>   /* waitpid()和一些不同的宏所需的头文件 */
  3.      #include <signal.h>     /* 信号函数的头文件 */
  4.      #include <stdio.h>      /* fprintf函数的头文件 */
  5.      #include <unistd.h>     /* fork函数的头文件 */   
  6.      void sig_chld(int);     /* 我们的 SIGCHLD 信号处理函数的原形(prototype) */
  7.    
  8.      int main()
  9.      {
  10.          struct sigaction act;
  11.          pid_t pid;
  12.    
  13.          /* 设定sig_chld函数作为我们SIGCHLD信号的处理函数 */
  14.          act.sa_handler = sig_chld;
  15.    
  16.          /* 在这个范例程序里,我们不想阻塞其它信号 */
  17.          sigemptyset(&amp;act.sa_mask);
  18.    
  19.          /*
  20.           * 我们只关心被终止的子进程,而不是被中断
  21.           * 的子进程 (比如用户在终端上按Control-Z)
  22.           */
  23.          act.sa_flags = SA_NOCLDSTOP;
  24.    
  25.          /*
  26.           * 使这些设定的值生效. 如果我们是写一个真实的应用程序,
  27.           * 我们也许应该保存这些原有值,而不是传递一个NULL。
  28.           */
  29.          if (sigaction(SIGCHLD, &act, NULL) < 0)
  30.          {
  31.              fprintf(stderr, "sigaction failed\n");
  32.              return 1;
  33.          }
  34.    
  35.          /* fork */
  36.          switch (pid = fork())
  37.          {
  38.          case -1:
  39.              fprintf(stderr, "fork failed\n");
  40.              return 1;
  41.    
  42.          case 0:                         /* 是子进程,直接结束 */
  43.              _exit(7);                   /* 退出状态 = 7 */
  44.    
  45.          default:                        /* 父进程 */
  46.              sleep(10);                  /* 给子进程完成的时间 */
  47.          }
  48.    
  49.          return 0;
  50.      }
  51.    
  52.      /*
  53.       * 信号处理函数 -- 只有当接收到一个SIGCHLD信号才被调用,
  54.       * 即有一个子进程终止
  55.       */
  56.      void sig_chld(int signo)
  57.      {
  58.          int status, child_val;
  59.    
  60.          /* 非阻塞地等待任何子进程结束 */
  61.          if (waitpid(-1, &status, WNOHANG) < 0)
  62.          {
  63.              /*
  64.               * 不建议在信号处理函数中调用标准输入/输出函数,
  65.               * 但在一个类似这个的玩具程序里或许没问题
  66.               */
  67.              fprintf(stderr, "waitpid failed\n");
  68.              return;
  69.          }
  70.    
  71.          /*
  72.           * 我们现在有保存在‘status’变量中的子进程退出信息并可以使用
  73.           * wait.h中定义的宏对其进行操作
  74.           */
  75.          if (WIFEXITED(status))                /* 子进程是正常退出吗? */
  76.          {
  77.              child_val = WEXITSTATUS(status); /* 获取子进程的退出状态 */
  78.              printf("child's exited normally with status %d\n", child_val);
  79.          }
  80.      }
复制代码

作者: rain_fish   发布时间: 2010-07-26

相关阅读 更多