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

标签 c fork wait waitpid

我的程序是这样表达的:有一个父级 fork 了一个 child ,而这个 child 又 fork 了另一个 child 。所以有一个父级、一个子级和一个子级(即该子级的父级就是子级)。

子进程使用 execlp() 执行命令,为了简单起见,我们说日期。子 child 也做同样的事情。

当然,子进程在执行命令之前会 fork 子进程。

我正在寻找子 child 在 child 执行自己的命令后执行该命令。此外,在子进程和子进程执行命令后,我希望父进程继续其自己的进程。

我有两个问题:

  • 我不知道如何让父级等待子级执行
  • 我无法让子子进程等待子进程执行(使用 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;
}

我的两个“问题”是第 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

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

最佳答案

感谢@JonathanLeffler,我可以通过创建管道来解决问题。由于我不知道管道是如何工作的,所以花了一些时间,但最终它比我想象的要容易得多。

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

谢谢。

关于c - 如何在执行进程之前等待子子进程和父进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46537114/

相关文章:

c - 为什么我的 C 中的 sin 计算代码返回错误的值?

c - 简单的 C 我无法理解

multithreading - Perl Fork 线程捕获输出

c - 从带有 fork() 的 exit() 返回是奇怪的移位

java - 在提到等待的时间之前元素可见所以隐式/显式等待是否仍然等到提到的时间或单击

c - 使用 'union' 和 'enum' 的好例子?

c - 指向数组中第一个元素的指针! (C)

java - 挑剔的主机(锁?)

c - 在分隔符处分割字符串并将子字符串存储在 C 中的 char **array 中

java - 在 For 循环中 hibernate 或等待