以下是代码段。
int saved_stdout = dup(1);
int fd = open("file.txt", O_WRONLY | O_CREAT, 0640);
close(1);
dup(fd);
close(fd);
printf("This text should go into the file\n");
//restore stdout
dup2(saved_stdout, 1);
printf("stdout restore");
我正在尝试了解dup和dup2。所以我最初将我的file.txt连接到stdout。所以每当我使用printf时,我应该写入file.txt而不是stdout。但是一旦我完成了这个用法,我想恢复它,所以我也在最后使用dup2。
问题是文本"此文本应该进入文件\ n"从来没有真正进入文件,但在stdout上打印。为什么这样?我试图找到它,只是发现dup2调用发生在printf之前("这个文字......");声明,为什么会这样?
答案 0 :(得分:3)
问题可能是由于输出缓冲造成的。 stdout
如果没有写入终端则完全缓冲,因此当您将其重定向到dup()
的文件时,它将被缓冲。尝试在printf()
之后刷新输出。
printf("This text should go into the file\n");
fflush(stdout);
答案 1 :(得分:0)
我删除了之前的答案,因为它错了......但是当你使用printf()
时,你正在使用FILE *
stdout
,其中有一个描述符或指向的东西到终点站。改变fd 1显然没有改变它。
我的测试结果不一致,所以放弃了。我只想补充说,在open()
之后放置这一行使它对我起作用,这突出了模糊的行为:
printf("fileno is %i\n", fileno(stdout));
不要将FILE *
等printf()
操作与文件描述符操作混合在一起。您应该将write()
与描述符一起使用。