【问题标题】:How can parents waits all child processes finish then exit when it receives SIGINT?父母如何等待所有子进程完成然后在收到 SIGINT 时退出?
【发布时间】:2011-09-25 13:51:44
【问题描述】:

我正在用 C 编写一个多进程程序。

我希望父进程可以等待所有子进程完成然后退出 它接收 SIGINT。

我有两个问题。

  1. 父母如何记录它派生的子进程的每个 pid。 子进程可能在录制功能运行之前完成 主要流程。

  2. 如果父母不知道它有多少子进程。他怎么能等 所有子进程完成。

提前致谢。

【问题讨论】:

    标签: c unix fork signals


    【解决方案1】:

    您在 fork 子进程时记录它们的 pid(如果需要)。 在 pid = 0 的循环中调用 waitpid 它将返回一个已退出进程的 pid 或返回 -1,如果 errno = ECHILD 你没有任何从站。

    【讨论】:

      【解决方案2】:

      继续循环调用wait(2)。每次 wait() 返回时,您都会返回退出子进程的 PID 及其状态。状态会告诉您,它是正常退出(带有退出代码)还是由于信号。像这样的东西(未测试):

      #include <sys/types.h>
      #include <sys/wait.h>
      ...
      pid_t    pid;
      int      status;
      ...
      while ((pid = wait(&status)) > 0) {
              printf("Child %lu ", (unsigned long)pid);
              if (WIFEXITED(status))
                      printf("exited with status %d\n", WEXITSTATUS(status));
              else if (WIFSIGNALED(status))
                      printf("killed by signal %d\n", WTERMSIG(status));
              else if (WIFSTOPPED(status))
                      printf("stopped by signal %d\n", WSTOPSIG(status));
              else if (WIFCONTINUED(status))
                      printf("resumed\n");
              else
                      warnx("wait(2) returned for no discernible reason");
      }
      

      【讨论】:

      • 如果 wait 返回 -1,您应该在跳出循环之前专门检查 ECHILD 的 errno。
      猜你喜欢
      • 2013-10-28
      • 2019-10-13
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      相关资源
      最近更新 更多