首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux dup2和printf

linux dup2和printf
EN

Stack Overflow用户
提问于 2016-01-08 11:12:59
回答 2查看 806关注 0票数 1

我正在尝试使用dup2将stdout重定向到另一个文件:

代码语言:javascript
复制
#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。因此,似乎printf会在没有换行符(\n)的情况下将第一个字符串写入缓冲区。

那么,到底会发生什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-08 11:16:00

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

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

\nprintf()中工作的原因似乎是因为printf()在连接到终端设备时是行缓冲的。所以\n触发了一次冲水。

票数 5
EN

Stack Overflow用户

发布于 2016-01-08 11:16:42

当FD被切换到FD下面时,第一个字符串仍然在FD中被缓冲。如果您需要确保FD在切换前是透明的,那么首先调用fflush(stdout)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34675691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档