標準出力をファイルに送信することが一貫性がなく、遅延するのはなぜですか? [コピー]

標準出力をファイルに送信することが一貫性がなく、遅延するのはなぜですか? [コピー]

私はプログラム呼び出しの出力をファイルprintfに送信する2つの方法を試しました。どちらの場合も、ファイルがすぐに更新されることがあり、数分かかるか、ファイルがまったく更新されない場合があります。

私のプログラムは、次のように作成した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

これ自動log.txt最初のケースのファイルと/var/log/user.log ファイル2番目のケースでは、両方とも上記の問題が発生します。また、bashスクリプトを実行させました。デモ実行ファイルを実行してもstart-stop-daemon同じ結果が表示されます。起動時にバックグラウンドプロセスでプログラムを実行するときにログファイルをすぐに一貫して更新するにはどうすればよいですか?

注:これが関連しているかどうかはわかりませんが、プログラムは実行され続け、絶対に終了しないように設計されています。

ベストアンサー1

出力ファイルが更新されない場合は、Cプログラムを修正してドアのfflush(stdout);後にドアを追加してみてくださいprintf()。これにより、出力ストリームに強制的に書き込まれます。通常、printf()に1つがあると、\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プログラムを変更できない場合は、プログラムの外部でバッファを強制的にフラッシュする方法がわかりません。

おすすめ記事