为什么不按顺序发生重复?

时间:2016-12-07 22:21:51

标签: c process sequence dup2 dup

以下是代码段。

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之前("这个文字......");声明,为什么会这样?

2 个答案:

答案 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()与描述符一起使用。