【问题标题】:the unexpected output of fork() when redirected to file.txt [duplicate]重定向到 file.txt 时 fork() 的意外输出 [重复]
【发布时间】:2013-08-20 07:22:11
【问题描述】:

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

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

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

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

请解释...

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

【问题讨论】:

  • @OliCharlesworth:- OP 已经提到他已经阅读了“Linux gcc 中 fork() 的工作”问题的解释。可他好像搞不清楚啊!!!! :)
  • @RahulTripathi:我意识到这一点,但再次问完全相同的问题是不合适的。相反,他/她应该具体说明他们对上一个问题/答案的不理解。
  • @OliCharlesworth:- 同意先生!!!
  • @OliCharlesworth:先生,如果我在评论中提出同一个问题,那么即使您告诉我,如果您有问题,最好单独提出。

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


【解决方案1】:

为什么我会打两次 Hi?

如果你写:

#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;
}

【讨论】:

  • 先生,我只用你的一个代码就理解了 i/o 缓冲区的整个概念,请给我推荐一些我应该参考的书或链接。
【解决方案2】:

有几种缓冲区:

完整的缓冲区

行缓冲区

没有缓冲区

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2021-10-20
    • 2013-07-07
    相关资源
    最近更新 更多