是否有3个子进程和1个父进程? 这两个不同的waitpid做了什么,为什么还有两个呢?
int main()
{
pid_t pid;
int status, counter = 4;
while(counter > 0)
{
pid = fork();
if(pid)
{
counter /= 2;
}
else
{
printf("%d", counter); /* (1) */
break;
}
}
if(pid)
{
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
printf(";%d", counter); /* (2) */
}
return counter;
}
waitpid打印3,5,6,34,52,61(不包括分号)后的第二个printf。 我不知道打印有两位数。我知道第二个数字可能来自while循环中的printf。
答案 0 :(得分:1)
是的,有3个子进程和1个父进程。孩子们返回4,2,1。
要收集所有状态,您可以使用while循环:
if(pid)
{
while (waitpid(-1, &status, 0) != -1) /* ignoring signals, errors */
counter += WEXITSTATUS(status);
}
return counter;
在这种情况下,Parent返回7。
如果您只使用两次waitpid()
来电,那么他们可能会从{4,2,1}
设置中返回任意一对,例如{4,1}
或{2,1}
,以便父母打印;5
和{相应地{1}}。
由于stdio缓冲和;3
交互,输出可能会倍增。见printf anomaly after “fork()”
fork()
之前fflush()
或儿童使用fork()
。