如何在执行进程之前等待子进程和父进程?

时间:2017-10-03 04:13:53

标签: c fork wait waitpid

以下是我的计划明确表达的内容:有一个父母要求孩子,这个孩子要求自己另一个孩子。所以有一个父母,一个孩子和一个子女(即这个子女的父母是孩子)。

孩子用execlp()执行命令,让我们说日期以使其变得简单。子代也这样做。

当然,孩子在执行命令之前会分子孙。

我正在寻找子进程在孩子执行自己的命令后执行命令。此外,在孩子和子女执行他们的命令后,我希望父母继续自己的过程。

我有两个问题:

  • 我不知道如何让父母等待子项执行
  • 我无法让子项等待子项执行(使用execlp时,孩子是否会丢失其pid?)

这是我目前的实施:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char **argv){
    pid_t pid1, pid2;

    pid1 = fork();

    if (pid1 > 0)
    {
        int status;

        // Wait child
        printf("Parent waiting for child\n");
        waitpid(pid1, &status, 0);
        printf("Parent has waited child\n");

        // Wait subchild
        printf("Parent waiting for subchild\n");
        // Wait sub-child here?
        printf("Parent has waited subchild\n");

        // End
        printf("parent end\n");
    }
    else
    {
        pid2 = fork();

        // Subchild
        if (pid2 == 0) {
            waitpid(getppid(), NULL, 0); // wait child? it doesn't work
            execlp("/bin/date", "date", "+Subchild:\"%d-%m-%y\"", (char *) 0);
            _exit(EXIT_FAILURE);
        }
        // Child
        else {
            execlp("/bin/date", "date", "+Child:\"%d-%m-%y\"", (char *) 0);
            _exit(EXIT_FAILURE);
        }
    }

    return 0;
}

我的两个问题&#34;是第21和33行。

输出如下:

Parent waiting for child
Subchild:"03-10-17"
Child:"03-10-17"
Parent has waited child
Parent waiting for subchild
Parent has waited subchild
parent end

子项尽可能快地执行自己...我通过使用共享变量解决了这个问题,但感觉就像一个解决方法,我仍然遇到了父子等待子项的问题。

1 个答案:

答案 0 :(得分:0)

感谢@JonathanLeffler我可以通过创建管道解决问题。需要时间,因为我不知道管道是如何工作的,但最终它比我想象的要容易得多。

@DavidC.Rankin我阅读了有关等待函数的文档,但在这种情况下似乎没有任何帮助。

谢谢。