gpt4 book ai didi

c++ - 这个 fork() 是如何工作的

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

你能告诉我,为什么这个程序的输出是这样的:1个2个2个5个5个3个4个5个4个5个3个4个5个4个5

快速解释为什么会这样?谢谢

main()
{
printf("1\n");
fork();
printf("2\n");
if(fork()==0)
{
printf("3\n");
fork();
printf("4\n");
}
printf("5\n");
}

最佳答案

你的程序的输出,假设没有调用 fork 失败,应该这样想:

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

每一列代表一个过程的输出。它们都以某种随机顺序序列化到 stdout 上, 受以下限制:在一列中,每个字符不能出现在紧靠其上方的字符之前;每列中最上面的字符不能出现在其上方和左侧的字符之前。

请注意,现在您的程序依赖于 C 库,它注意到 stdout 是一个终端,因此将其设置为行缓冲。如果您在将 stdout 重定向到文件或管道的情况下运行程序,您可能会得到相当不同的输出,例如

$ ./a.out | tr '\n' ' '
1 2 5 1 2 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

... 因为在那种情况下,所有输出都被缓冲,直到从 main 返回,并且缓冲区被复制到每个子进程中。添加

setvbuf(stdout, 0, _IONBF, 0);

在第一个 printf 语句之前将防止重复输出。 (在这种情况下,您可以改用 _IOLBF,但 _IONBF 对于这样的代码更安全。)

关于c++ - 这个 fork() 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20408061/

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