我正在尝试将dup2 redirect stdout用于另一个文件:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
int newfd;
if ((newfd = open("output_file.txt", O_CREAT|O_TRUNC|O_WRONLY, 0644)) < 0) {
exit(1);
}
printf("Luke, I am your...\n");
dup2(newfd, 1);
printf("Foobar.\n");
return 0;
}
当第一个printf
打印换行符\n
时,Luke, I am your...
将打印到屏幕上,Foobar
将写入 output_file.txt ,如果第一个printf没有打印新行printf("Luke, I am your...");
,则两个字符串都将写入output_file.txt。因此,当没有换行符(\n
)时,printf会将第一个字符串写入缓冲区。
真正发生了什么?
答案 0 :(得分:4)
原因是当您没有换行符\n
时,printf()
打印的字符串会被缓冲。因此缓冲区的整个内容将打印到文件中。这与第二次调用printf()
无关。
如果您在第一个fflush(stdout);
后执行printf()
,则无论您是否在第一个'\n
中都有换行符printf()
,您都不会看到此行为。因为fflush()
将清除(刷新)缓冲的所有输出,直到那一点。
\n
printf()
似乎可以正常工作的原因是因为printf()
在连接到终端设备时是行缓冲的。所以\n
触发了冲洗。
答案 1 :(得分:2)
当FD在其下方切换时,第一个字符串仍在FD中缓冲。如果您需要在切换之前确保FD已清除,请先调用fflush(stdout)
。