我的程序是这样表达的:有一个父级 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/