fork()重定向到file.txt时的意外输出

时间:2013-08-18 09:47:53

标签: c gcc linux-kernel fork process-control

我正在使用c在linux操作系统中进行过程控制。 fork()函数真让我迷惑。 我所知道的:当fork()被称为时               1)将fork()之后的代码复制到子进程中。               2)我们无法确定哪个(父或子)将首先运行。 我运行以下代码。

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

我的第一个问题是:为什么我嗨两次?                        它在Working of fork() in linux gcc中有解释,但我仍然希望有人能够更简单地解释。

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

  

     

请解释......

如果我错过了,请在了解fork()

时向我提供一些细节

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

有缓冲区:

完整缓冲区

行缓冲

没有缓冲区

在终端中使用printf时,默认为line buffer。因此,您可以使用\n来刷新缓冲区。刷新缓冲区后,只打印一个hi

使用printf重定向到文件时。默认为full buffer。因此,您无法使用\n来刷新缓冲区。如果没有刷新缓冲区,则打印两个hi

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