我正在尝试使用dup2将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。因此,似乎printf会在没有换行符(\n)的情况下将第一个字符串写入缓冲区。
那么,到底会发生什么呢?
发布于 2016-01-08 11:16:00
原因是当您没有换行符\n时,printf()打印的字符串将被缓冲。因此,缓冲区的全部内容被打印到文件中。这与第二次调用printf()无关。
如果在第一个fflush(stdout);之后执行printf(),则无论第一个printf()中是否有换行符'\n,都不会看到这种行为。因为fflush()会清除(刷新)所有缓冲的输出,直到那个时候。
\n在printf()中工作的原因似乎是因为printf()在连接到终端设备时是行缓冲的。所以\n触发了一次冲水。
发布于 2016-01-08 11:16:42
当FD被切换到FD下面时,第一个字符串仍然在FD中被缓冲。如果您需要确保FD在切换前是透明的,那么首先调用fflush(stdout)。
https://stackoverflow.com/questions/34675691
复制相似问题