如何将标准输出重定向到一个文件,然后恢复标准输出?
How to redirect stdout to a file and then restore stdout back?
这是我的代码,但我无法让它工作。
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");
我对我的代码进行了一些修改。
您需要检查函数调用的 return 值。对于大多数函数,您应该检查错误情况。这样做可能会暴露出以下问题:如果您希望 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()
将文件描述符复制到 特定的 文件描述符编号上更干净、更安全。你在恢复时这样做,但你也应该在初始重定向时这样做。
这是我的代码,但我无法让它工作。
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");
我对我的代码进行了一些修改。
您需要检查函数调用的 return 值。对于大多数函数,您应该检查错误情况。这样做可能会暴露出以下问题:如果您希望 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()
将文件描述符复制到 特定的 文件描述符编号上更干净、更安全。你在恢复时这样做,但你也应该在初始重定向时这样做。