【问题标题】:How to redirect stdout to a file and then restore stdout back?如何将标准输出重定向到文件然后恢复标准输出?
【发布时间】:2017-12-08 18:09:04
【问题描述】:

这是我的代码,我无法让它工作。

int pfd = open("file", O_WRONLY, 0777);
int saved = dup(1);
close(1);
dup(pfd);
close(pfd);
printf("This goes into file\n");

// restore it back
dup2(saved, 1);
close(saved);
printf("this goes to stdout");

我对我的代码添加了一些修改。

【问题讨论】:

  • dup(pfd); 不会让标准输出写入文件。
  • 您是否考虑过多次使用dup2
  • 对不起,我忘了在dup(pfd)之前添加close(1)
  • 好像是this的骗子
  • 但我在第一行打开文件。该链接中的解决方案在复制后将其打开。我应该如何让我的工作?

标签: c stdout io-redirection dup2 dup


【解决方案1】:

您需要检查函数调用的返回值。对于大多数功能,您应该检查错误情况。这样做可能会暴露一个问题,如果您希望 open() 在最初不存在的情况下创建请求的文件,那么您需要添加 O_CREAT 标志。

但这不是您的主要问题 - 您正在处理缓冲问题。第一个printf() 的输出缓冲在内存中,因此即使文件描述符1 在调用printf() 时引用您的文件,您写入的数据也不会立即刷新到目标文件。然后,您恢复原始的stdout 文件句柄,因此当实际刷新数据时,它们会转到(恢复的)原始标准输出。在切换 stdout 之前通过 fflush()ing 解决这个问题:

int pfd = open("file", O_WRONLY | O_CREAT, 0777);
int saved = dup(1);

close(1);
dup(pfd);
close(pfd);
printf("This goes into file\n");
fflush(stdout);  // <-- THIS

// restore it back
dup2(saved, 1);
close(saved);
printf("this goes to stdout");

还请注意,dup2() 将文件描述符复制到 特定 文件描述符编号更干净、更安全。您在恢复时执行此操作,但您也应该在初始重定向时执行此操作。

【讨论】:

  • 我的错,这是我的错误。将撤回评论。感谢您的回答。 fflush 可以解决问题
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
相关资源
最近更新 更多