这是我的代码,但我无法让它正常工作。
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");
我对我的代码进行了一些修改。
这是我的代码,但我无法让它正常工作。
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");
我对我的代码进行了一些修改。
open()
在文件不存在时创建请求的文件,则需要添加 O_CREAT
标志。printf()
的输出被缓存在内存中,因此即使文件描述符1在调用 printf()
时指向你的文件,你写入的数据也不会立即刷新到目标文件。然后你恢复了原始的 stdout
文件句柄,所以当数据实际刷新时,它们会发往(恢复的)原始 stdout。在切换回 stdout
之前,使用 fflush()
解决这个问题: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()
在将文件描述符复制到 特定的 文件描述符编号上时更加干净和安全。在恢复时应该这样做,但对于初始重定向也应该这样做。
dup(pfd);
不会使 stdout 写入文件。 - tkausldup2
吗? - Basile Starynkevitchdup(pfd)
之前添加close(1)
。 - posixKingstdin
之后打开了 文件。此时这两个文件是不相关的。这些操作的顺序会有什么影响呢? - bnaecker