这是我的代码,我无法让它工作。
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");
我在代码中添加了一些修改。
答案 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()
更清晰,更安全,可将文件描述符复制到特定的文件描述符编号上。您在还原时执行此操作,但您也应该在初始重定向时执行此操作。