如何将stdout重定向到文件然后恢复stdout?

时间:2017-12-08 18:09:04

标签: c stdout io-redirection dup2 dup

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

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");

我在代码中添加了一些修改。

1 个答案:

答案 0 :(得分:0)

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

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

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()更清晰,更安全,可将文件描述符复制到特定的文件描述符编号上。您在还原时执行此操作,但您也应该在初始重定向时执行此操作。