linux dup2 和 printf

linux dup2 and printf

我正在尝试使用 dup2 将标准输出重定向到另一个文件:

#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 似乎会将第一个字符串写入缓冲区(\n)。

然后到底发生了什么?

原因是当你没有换行符\n时,printf()打印的字符串被缓冲了。所以缓冲区的全部内容都打印到文件中。这与第二次调用 printf().

无关

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

printf() 中的 \n 似乎可以正常工作的原因是 printf() 在连接到终端设备时是 line-buffered。所以 \n 触发刷新。

当FD在其下方切换时,第一个字符串仍缓存在FD中。如果切换前需要保证FD清空,那么先调用fflush(stdout)