如何在C中将重定向输出写入文件内部循环?

1 c unix redirect file

我正在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)

在将输出重定向到文件之前.然后程序实时地将这些行写到文件中,这很好,但也在那里写了第一行(非重定向)行.我不希望输出文件中的第一行,我不明白当输出没有重定向时它是如何写入文件的(可能重定向自上次运行后仍然存在?),以及它如何导致这些行突然写入实时.

任何人都可以解释我它是如何工作的?

Arn*_*anc 5

  1. 您没有检查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)
  2. stdio流被缓冲,并且在完成真实文件描述之前写入发生在内存中.

    尝试加入fflush(stdout)之后printf().

  • @Chris:一些Unix C库在第一次写入时决定`stdout`是否是一个终端(因此是否对它进行行缓冲).通过在第一次写入之前交换文件描述符1,OP向库显示它不是终端. (2认同)