-2

我正在使用 c 在 linux 操作系统中进行过程控制。fork() 函数真的让我很困惑。我所知道的:什么时候fork()被调用
1)无论后面的代码fork(),都被复制到子进程中。2)我们无法确定哪个(父母或孩子)将首先运行。我运行以下代码。

int main() {
    printf("Hi");
    fork();
    return 0;
}

我的第一个问题是:为什么我得到两次 Hi?linux gcc 中 fork() 的工作中对此进行了解释,但我仍然希望有人更简单地解释一下。

我的第二个疑问:当我将输出重定向到 somefile.txt 时,即使我使用换行符(\n),输出也是:

你好

你好

请解释 ...

如果我错过了,请提供一些详细信息,以了解fork()

4

2 回答 2

1

为什么我得到两次嗨?

如果你写:

#include <stdio.h>

int main()
{
  printf("Hi");

  for (;;)
    ;

  return 0;
}

"Hi"不会被打印stdout,因为标准输出流默认是行缓冲的。这意味着您必须添加一个'\n'来刷新此缓冲区。

#include <stdio.h>

int main()
{
  printf("Hi\n");

  for (;;)
    ;

  return 0;
}

使用fork,父进程的缓冲区将被复制到子进程中。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
  printf("Hi");

  /* stdout in the father process contains "Hi" */
  fork();

  /* stdout in the father process contains "Hi" */
  /* stdout in the child process contains "Hi" */

  /* With return statement all buffers are flushed and "Hi" is printed twice */
  return 0;
}
于 2013-08-18T09:55:33.827 回答
0

有几种缓冲区:

全缓冲

行缓冲器

无缓冲

当您printf在终端中使用时。它是line buffer默认的。所以你可以\n用来刷新缓冲区。刷新缓冲区后,您只打印一个hi

当您使用printf重定向到文件时。它是full buffer默认的。所以你不能\n用来刷新缓冲区。如果不刷新缓冲区,则打印两个hi

您可以使用setvbuf `更改缓冲区类型。

于 2013-08-18T10:52:29.673 回答