linux dup2和printf

时间:2016-01-08 11:12:59

标签: c linux dup2

我正在尝试将dup2 redirect stdout用于另一个文件:

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

int main(void)
{
  int newfd;
  if ((newfd = open("output_file.txt", O_CREAT|O_TRUNC|O_WRONLY, 0644)) < 0) {
    exit(1);
  }
  printf("Luke, I am your...\n");
  dup2(newfd, 1);
  printf("Foobar.\n");
  return 0;
}

当第一个printf打印换行符\n时,Luke, I am your...将打印到屏幕上,Foobar将写入 output_file.txt ,如果第一个printf没有打印新行printf("Luke, I am your...");,则两个字符串都将写入output_file.txt。因此,当没有换行符(\n)时,printf会将第一个字符串写入缓冲区。

真正发生了什么?

2 个答案:

答案 0 :(得分:4)

原因是当您没有换行符\n时,printf()打印的字符串会被缓冲。因此缓冲区的整个内容将打印到文件中。这与第二次调用printf()无关。

如果您在第一个fflush(stdout);后执行printf(),则无论您是否在第一个'\n中都有换行符printf(),您都不会看到此行为。因为fflush()将清除(刷新)缓冲的所有输出,直到那一点。

\n printf()似乎可以正常工作的原因是因为printf()在连接到终端设备时是行缓冲的。所以\n触发了冲洗。

答案 1 :(得分:2)

当FD在其下方切换时,第一个字符串仍在FD中缓冲。如果您需要在切换之前确保FD已清除,请先调用fflush(stdout)