0

我正在使用很多叉子制作一个小程序。第一个父母必须等待每个孩子。只有一个孩子很容易,有孩子结束信号(SIGCLHD)。但是,如果我的第一个孩子在最后一个孩子之前结束怎么办?我的主程序在每个孩子结束之前运行,我需要主程序等待孩子。

每个孩子都以执行另一个程序结束,这解释了为什么我不能与信号量之类的东西同步。

// Working pretty good
execvp(
    c->command_name, /* program to execute */
    c->argv          /* argv of program to exécuter */
);

这是我的“叉形结构”:

main
 |
 |------
 |     |
 |     |
 |     |------
 |     |     |
 |    EOE    |
 |           |
 |          EOE
 |
 |
EOE

传奇:

  • EOE 意思是“执行结束
  • 线顶部机器人是时间线
  • 左边的每一步都是一个新的孩子。
  • 每个竖条代表一个条的执行

谢谢!

4

2 回答 2

2

要找出哪些子进程已waitpid在您的 SIGCHLD 处理程序中终止使用:

/* SIGCHLD handler. */
static void sigchld_hdl (int sig)
{
    pid_t child_pid;

    /* Wait for all dead processes.
     * We use a non-blocking call to be sure this signal handler will not
     * block if a child was cleaned up in another part of the program. */
    while ((child_pid = waitpid(-1, NULL, WNOHANG)) > 0) {
          // child_pid contains the terminated child process' pid
    }
}

有关更多详细信息和此代码段所基于的sscce ,请查看示例的源代码

编辑:

所以问题是如何不仅等待孩子,而且等待所有后代。

在伪代码中:

int alive_descendants = 0;

sigchld_handler() {
    decrement alive_descendants for each zombie;
}

int main() {
     setup-sigchld-handler;

     int fd[2];
     if (pipe(fd)) { error }

     to create a child:
         write a single byte to fd[1]
         fork off the child
         in the child process:
             close(fd[0]);
             to create child:
                  write a single byte to fd[1]
                  fork off the child
                  ...

     in the root process:
         close(fd[1]);
         for each byte read from fd[0], increment alive_descendants
         if alive_descendants == 0 and fd[0] is empty:
              ascertain that all descendants have terminated
              close(fd[0]);        
}
于 2013-05-25T22:53:25.940 回答
0

你试过了吗

// for each child spawned:
children[i] = fork(); // children is an array of pid_t
if (children[i] == 0) {
    execvp(
        c->command_name, /* programme à exécuter */
        c->argv          /* argv du programme à exécuter */
    );

// parent process keeps doing its thing, and then
for (i = 0; i < NUMBER_OF_CHILDREN; i++) {
    waitpid(children[i], NULL, 0);
}
于 2013-05-25T22:56:13.637 回答