我正在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);
}
}
但它不会写入输出文件。我试图用10个循环来更改for的while循环,结果发现它在系列结束后立即将所有10行写入文件。这对我不太好,而我需要有一个无限循环。
当我不重定向输出时,一切正常,并且每秒钟终端上都会出现新行。
我也试着放一个
printf("text\n");
在将输出重定向到文件之前然后程序将这些行实时写入文件,这是很好的,但也在那里写入了第一行(非重定向)。我不想让这第一行出现在我的输出文件中,我不明白当输出还没有被重定向时,它是如何被写入文件的(可能自从上次运行后重定向就一直存在?),以及如何导致这些行突然被实时写入。
有人能解释一下它是怎么工作的吗?
最佳答案
您没有检查open()和dup2()的返回值。如果open()或dup2()失败,它将不会在output.txt中写入任何内容。
if (outDes < -1) {
perror("open");
return 1;
}
if (dup2(outDes, 1) == -1) {
perror("dup2");
return 1;
}
stdio流被缓冲,在对真正的文件描述进行写操作之前,写操作在内存中进行。
尝试在
fflush(stdout)
之后添加printf()
。关于c - 如何在C中的循环内将重定向的输出写入文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7391071/