gpt4 book ai didi

叉()操作系统。 4 hi 进入输出,期待 3 hi

转载 作者:行者123 更新时间:2023-12-04 01:50:12 29 4
gpt4 key购买 nike

for(i=0;i<2;i++)
if(fork()==0)
printf("Hi");

我期待 3 嗨和 4 嗨
所以我编辑了 printfprintf("Hi %d %d %d ",i,getpid(),getppid());创建的第一个 child 打印了两个具有相同值的 hi,即 0,其 pid 和 parent 的 pid 也相同。为什么?

最佳答案

这很有趣,看起来答案是输出缓冲。例如我们有:

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

int main() {
for(int i=0;i<2;i++) {
if(fork()==0) {
printf("Hi %d %d %d\n",i,getpid(),getppid());
}
}
}

如果在终端中运行此代码将有 3 行,但如果我将输出重定向到 less 将有 4 行!

如果我们在 printf() 之后刷新缓冲区,问题就会消失:
  // ...
printf("Hi %d %d %d\n",i,getpid(),getppid());
fflush(stdout);
// ...

发生这种情况是因为 stdout 被缓冲了,所以当进程 fork 时,缓冲区仍然没有刷新。

来自 man stdout :

The stream stderr is unbuffered. The stream stdout is line-buffered when it points to a terminal. Partial lines will not appear until fflush(3) or exit(3) is called, or a newline is printed. This can produce unexpected results, especially with debugging output.

关于叉()操作系统。 4 hi 进入输出,期待 3 hi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36906757/

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