gpt4 book ai didi

c - 使用 fork() 的奇怪行为;

转载 作者:太空狗 更新时间:2023-10-29 16:05:45 25 4
gpt4 key购买 nike

我有这个用 C 编写的小程序

main(int argc, char **argv)
{
forkit(4);
}
void forkit(int n)
{
if(n > 0)
{
fork();
printf("%d \n", n);
forkit(n-1);
}
}

打印

4 4 3 3 3 3 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

30 个数字,全部换行。但是,如果我删除 printf 语句中的 \n,它会打印出:

4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1

如果没有换行,它会给出 64 个数字。

这么小的变化怎么会产生如此不同的结果?

最佳答案

很好的问题, 发生了一些微妙的事情。

发生的事情是 printf 的输出是行缓冲的,并在换行处刷新。

就其本身而言,这不会影响大多数程序的输出,只会影响速度。

但是当您 fork 时,尚未输出的缓冲 I/O 现在存在于两个子节点中。使用换行符 in 输出已经发生,因此它不再在子进程中挂起。

这就是解释。如果不清楚,另一种表达方式是:没有换行符,待处理的输出乘以进程树中 future 子进程的数量。对于换行符,它只是过去发生的输出,程序会按您预期的方式运行。

请注意,即使没有换行符,输出最终也会被刷新,但是当程序调用 exit(3) 时会发生这种情况。 到那时,它已经 fork 并传递到待定状态(即 < em>缓冲)输出。

顺便说一句,如果您将输出重定向到一个文件,它将被 block 缓冲并且您可能会在两种情况下看到类似的结果(换行符除外)。

关于c - 使用 fork() 的奇怪行为;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42568430/

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