我尝试了两种方法将程序调用的输出定向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 程序,那么我不知道如何强制从程序外部刷新缓冲区。