linux dup2 和 printf
linux dup2 and printf
我正在尝试使用 dup2 将标准输出重定向到另一个文件:
#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 似乎会将第一个字符串写入缓冲区(\n
)。
然后到底发生了什么?
原因是当你没有换行符\n
时,printf()
打印的字符串被缓冲了。所以缓冲区的全部内容都打印到文件中。这与第二次调用 printf()
.
无关
如果您在第一个 printf()
之后执行 fflush(stdout);
,无论您是否在第一个 printf()
中有换行符 '\n
,您都不会看到此行为.因为 fflush()
将清除(刷新)缓冲到该点之前的所有输出。
printf()
中的 \n
似乎可以正常工作的原因是 printf()
在连接到终端设备时是 line-buffered。所以 \n
触发刷新。
当FD在其下方切换时,第一个字符串仍缓存在FD中。如果切换前需要保证FD清空,那么先调用fflush(stdout)
我正在尝试使用 dup2 将标准输出重定向到另一个文件:
#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 似乎会将第一个字符串写入缓冲区(\n
)。
然后到底发生了什么?
原因是当你没有换行符\n
时,printf()
打印的字符串被缓冲了。所以缓冲区的全部内容都打印到文件中。这与第二次调用 printf()
.
如果您在第一个 printf()
之后执行 fflush(stdout);
,无论您是否在第一个 printf()
中有换行符 '\n
,您都不会看到此行为.因为 fflush()
将清除(刷新)缓冲到该点之前的所有输出。
printf()
中的 \n
似乎可以正常工作的原因是 printf()
在连接到终端设备时是 line-buffered。所以 \n
触发刷新。
当FD在其下方切换时,第一个字符串仍缓存在FD中。如果切换前需要保证FD清空,那么先调用fflush(stdout)