我编写了以下程序并在终端中执行。但我很困惑,程序没有显示结果,因为互联网上描述了等待行为。我从一本书中复制了这段代码。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pid_t childid;
if(argc!=2)
{
printf("Please an argument at terminal\n");
return 0;
}
int i,n = atoi(argv[1]);
for(i=0;i<n;i++)
{
childid=fork();
if(childid==0)
{
//sleep(20);
break;
}
}
while(wait(NULL)>0);
printf("i= %d\n Process ID %d\n Parent ID %d\n Child ID %d\n",i,getpid(),getppid(),childid);
return 0;
}
父进程是否应该执行最后的“printf”语句 n 次,其中 n 是创建的子进程的数量。当父进程调用 while(wait(NULL)>0); 并且子进程仍在执行时会发生什么?
谢谢
答案1
该wait()
系统调用暂停调用进程的执行,直到其某个子进程终止。
wait() 返回状态已改变(或终止)的子进程的 pid。如果出现错误(即没有子进程需要等待),则返回 -1。
因此,while 循环在子进程(分叉进程)中将执行 0 次。而在父进程中,它将执行 n(子进程数量)次。
该程序将打印最后一条消息 n+1 次。(主程序中 1 次,子程序中 n 次)