gpt4 book ai didi

c - 将 Fork 与 waitpid 一起使用

转载 作者:行者123 更新时间:2023-11-30 15:41:11 24 4
gpt4 key购买 nike

是否有 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 之后的第二个 printf 打印 3, 5, 6, 34, 52, 61(不包括分号)。我不确定如何打印两位数。我知道第二个数字可能来自 while 循环中的 printf。

最佳答案

是的,有 3 个子进程和 1 个父进程。 children 返回 4、2、1。

要收集所有状态,您可以使用 while 循环:

if(pid)
{
while (waitpid(-1, &status, 0) != -1) /* ignoring signals, errors */
counter += WEXITSTATUS(status);
}
return counter;

在这种情况下,父级返回 7。

如果您仅使用两个 waitpid() 调用,那么它们可能会返回 {4,2,1} 集合中的任何对,例如 {4,1 }{2,1},因此父级相应地打印 ;5;3

由于 stdio 缓冲和 fork() 交互,输出可能会成倍增加。请参阅printf anomaly after “fork()”

要么在 fork() 之前使用 fflush(),要么在子项中使用 write/_exit

关于c - 将 Fork 与 waitpid 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20594411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com