我正在尝试创建此
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
答案 0 :(得分:0)
来自wait
的{{3}},(强调我的)
wait()系统调用暂停执行调用进程,直到其中一个子终止。
在您的情况下,在每次执行中,P0
的子项完成执行的顺序可能不同。一旦任何一个孩子完成执行,P0
就会停止等待并恢复。即使这样,P0
执行其printf()
语句的顺序与仍在执行的任何子项相比,每次执行时仍可能不同。因此,它每次都出现在不同的地方。
如果您想等待所有孩子完成执行,那么您需要拨打wait
的次数与孩子的数量相同。在您的情况下,您可以在wait
上拨打P2
三次,然后在P0
两次拨打电话。