使用fork()和wait()混淆,这也是最有效的方法吗?

时间:2017-04-22 17:56:27

标签: c fork wait

我正在尝试创建此

Industry_other

使用 P0 / \ P1 P2 / | \ P3 P4 P5 这是我的代码

fork()

我的目标是让第一个进程等待,直到我的#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <wait.h> int main() { printf("P0 PID=%d, PPID=%d.\n", getpid(), getppid()); int pid1, pid2, pid3, pid4, pid5; pid1 = fork(); int status = 0; if(pid1 != 0){ pid2 = fork(); if(pid2 != 0){ waitpid(pid2, &status, 0); //If father, wait for child P2 printf("%d\n", status); } else{ printf("P2 PID=%d, PPID=%d.\n", getpid(), getppid()); pid3 = fork(); if(pid3 != 0){ //If father (P2 at this point) waitpid(pid3, &status, 0); //Wait for child (P3) pid4 = fork(); if(pid4 != 0){ waitpid(pid4, &status, 0); pid5 = fork(); if(pid5 == 0){ printf("P5 PID=%d, PPID=%d.\n", getpid(), getppid()); } } else{ printf("P4 PID=%d, PPID=%d.\n", getpid(), getppid()); } } else{ printf("P3 PID=%d, PPID=%d.\n", getpid(), getppid()); } } } else{ printf("P1 PID=%d, PPID=%d.\n", getpid(), getppid()); } return 0; } 进程完成所需的一切,然后继续。 此行P2用于查看printf("%d\n", status);(父)进程何时继续,但每次都在不同的位置打印。我很迷茫。我这样做了吗? 另外,这是创建上述内容的最有效方法吗? 谢谢

更新

我在代码中更改了一些内容(请参阅注释),现在我使用P0。我认为这是正确的。我等待P2结束,P2等待P3,P4也结束。 This is the output

1 个答案:

答案 0 :(得分:0)

来自wait的{​​{3}},(强调我的)

  

wait()系统调用暂停执行调用进程,直到其中一个子终止。

在您的情况下,在每次执行中,P0的子项完成执行的顺序可能不同。一旦任何一个孩子完成执行,P0就会停止等待并恢复。即使这样,P0执行其printf()语句的顺序与仍在执行的任何子项相比,每次执行时仍可能不同。因此,它每次都出现在不同的地方。

如果您想等待所有孩子完成执行,那么您需要拨打wait的次数与孩子的数量相同。在您的情况下,您可以在wait上拨打P2三次,然后在P0两次拨打电话。

相关问题