gpt4 book ai didi

c - 该代码 C 的可能 3 个输出是什么?叉()

转载 作者:行者123 更新时间:2023-11-30 19:58:23 27 4
gpt4 key购买 nike

我对这个 fork 语句很陌生,我不知道 C 程序上的 fork 方法。你能告诉我这段代码的三个可能的输出是什么吗?

#include <unistd.h>
#include <stdio.h>

int main(void) {
printf("10\n");
if (fork())
printf("2\n");
else
printf("3\n");
printf("4\n");
return 0;
}

我只知道它的一个输出

10
3
4

if (fork()) 为 true 时,其他 2 个输出是什么?

最佳答案

理解它的关键很简单:fork()如果成功,则返回两次:在父级中,在子级中。在父进程中,它返回新生子进程的PID;在子进程中它返回 0;

10 3 4永远不会发生:如果 3打印出来,说明子进程创建成功(因为fork()在子进程上返回0),所以有两个进程会打印4 。假设 fork() ,输出中不可能只有一个 4成功了。

这是一组可能的输出:

  • 10 2 4 3 4 :如果父进程先执行所有内容,然后是子进程,就会发生这种情况。父打印 10 2 4然后 child 打印 3 4 .
  • 10 2 3 4 4 :当父进程首先执行时发生,打印 2 ,然后子进程执行并打印 3 ,然后父级或子级打印 4 ,然后另一个打印 4
  • 10 3 4 2 4 :当子进程首先执行时发生,打印 34 ,然后父进程继续并打印 24 .
  • 10 3 2 4 4 :当子进程首先执行时发生,打印 3 ,然后父进程继续并打印 2 ,然后父级或子级打印 4 ,然后另一个打印最终的 4 .
  • 10 2 4 :发生在fork()时失败并返回 -1 ,在这种情况下,不会创建子进程,因此您只能获得原始进程的输出

如果您在行缓冲终端中运行程序,则这些都是可能的。但是,如果将输出重定向到文件,您可能会惊讶地看到 10在输出中多次出现。

发生这种情况是因为重定向到文件通常会将缓冲模式从行缓冲切换为完全缓冲。假设缓冲区大小大于字符串 10\n 的 3 个字符并且缓冲区没有同时刷新 - 这也是一个合理的假设 - 子进程将从包含 10\n 的输出缓冲区开始。 。所以,你最终有两个 10\n在输出中。

因此,在这种情况下,可能的输出集可以扩展为包括另一个 10在 child 打印之前的各种可能性 3 :

  • 10 2 4 10 3 4
  • 10 2 10 3 4 4
  • 10 10 3 4 2 4
  • 10 10 3 2 4 4

关于c - 该代码 C 的可能 3 个输出是什么?叉(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31010103/

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