为什么将标准输出定向到文件不一致且延迟?

为什么将标准输出定向到文件不一致且延迟?

我尝试了两种方法将程序调用的输出定向printf到文件。在这两种情况下,有时文件会立即更新,有时需要几分钟,有时根本不更新文件。

我的程序从 bash 脚本运行,该脚本由/etc/network/if-up.d/upstart。我已经为我的 bash 脚本尝试过这个:

    #!/bin/bash
    sleep 2

    if ! pgrep "demo" > /dev/null
    then
        sudo /home/pi/code/demo_device/demo >> /home/pi/code/demo_device/auto_log.txt 2>&1 &
    fi

和这个:

    #!/bin/bash
    exec 1> >(logger -s -t $(basename $0)) 2>&1
    sleep 2

    if ! pgrep "demo" > /dev/null
    then
        sudo /home/pi/code/demo_device/demo &
    fi

自动日志.txt第一种情况下的文件和/var/log/user.log 文件在第二种情况下,两者都存在我上面描述的问题。我还让 bash 脚本运行演示可执行文件start-stop-daemon,我得到了相同的结果。当启动时将程序作为后台进程运行时,如何才能立即一致地更新日志文件?

注意:我不知道这是否相关,但该程序被设计为连续运行并且永不退出。

答案1

关于输出文件未更新,请尝试修改 C 程序并在语句fflush(stdout);后面添加一条语句printf()。这将强制写入输出流。通常,如果您的 printf()\n中有一个,那么它将导致输出写入屏幕或文件,但并非总是如此。因此,当您确实希望它发生时,请使用fflush(); 并且您不必在每个 printf 语句之后使用 fflush() ,只需将其放在最有意义的地方,以便在那时您需要所有先前的 printf 语句它可能仍在缓冲区中被写出。

如果 C 程序不是写入 stdout 而是写入其他文件句柄,则将该文件指针放入 fflush() 中,如下面的示例程序所示

#include <stdio.h>

int main ( int argc, char *argv[] )
{
    FILE *fp;

    fp = fopen( "test.txt", "w" );
    if ( fp != NULL )
    {
       fprintf( fp, "hello world\n");
       fflush( fp );

       /* 
          100+ lines of code here doing something else,
          which could cause the above printf to sit in the
          buffer until fclose or the program ends
       */

       fclose( fp );
    }
    return 0;
}

如果您无法修改写入输出的 C 程序,那么我不知道如何强制从程序外部刷新缓冲区。

相关内容