我正在unix上编写一个C程序,它应该将它的输出重定向到文件,并在无限循环中每秒写入一些文本:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
int outDes = open("./output.txt", O_APPEND | O_WRONLY);
dup2(outDes, 1);
while(1) {
printf("output text\n");
sleep(1);
}
}
Run Code Online (Sandbox Code Playgroud)
但它没有写任何输出文件.我尝试用10个循环更改'for'的'while'循环,我发现它在系列结束后立即将所有10行写入文件.这对我来说不是很好,而我需要一个无限循环.
当我没有重定向输出时,一切正常,终端上每秒都会出现新行.
我也试过放一个
printf("text\n");
Run Code Online (Sandbox Code Playgroud)
在将输出重定向到文件之前.然后程序实时地将这些行写到文件中,这很好,但也在那里写了第一行(非重定向)行.我不希望输出文件中的第一行,我不明白当输出没有重定向时它是如何写入文件的(可能重定向自上次运行后仍然存在?),以及它如何导致这些行突然写入实时.
任何人都可以解释我它是如何工作的?
您没有检查open()和dup2()的返回值.如果open()或dup2()失败,它将不会在output.txt中写入任何内容.
if (outDes < -1) {
perror("open");
return 1;
}
if (dup2(outDes, 1) == -1) {
perror("dup2");
return 1;
}
Run Code Online (Sandbox Code Playgroud)stdio流被缓冲,并且在完成真实文件描述之前写入发生在内存中.
尝试加入fflush(stdout)之后printf().