0

いくつかの情報をコンソールに出力してから無限ループに入る C プログラムがあります。プログラムをバックグラウンドで実行し、出力をログ ファイルにリダイレクトする必要があります。プログラムに無限ループがない場合はリダイレクトが機能し、プログラムに無限ループがある場合は何も書かれていません。

たとえば、このプログラムtest.c :

#include <stdio.h>
main (void) {
printf("Hello world\n");
while(1);
}

実行すると、コンソールにHello worldという行が表示されますが、. /test > logfileを実行すると、ファイルに何も書き込まれません。

これを機能させる方法はありますか?

ありがとう!

4

3 に答える 3

1

出力は、プロセス内のメモリ内バッファーにあります。

無限ループがない場合、C ライブラリのコードによって、プロセスが終了する直前にバッファがフラッシュされます。

それを修正する簡単な方法の 1 つは、次を挿入することです。

setlinebuf(stdout);

プログラムの開始時: 各行は、書き込み後にフラッシュされます。( を参照してくださいman setbuf(3)。)fflush()無限ループに入る前に行うこともできますが、このプログラムが計算の合間に出力を少しずつ出力することが予想される場合は、毎回フラッシュすることを覚えておくよりも、バッファリングを一度だけ修正する方が簡単です。

C は、端末への書き込み時には行バッファリングをデフォルトに設定しますが、ファイルへの書き込み時にはより大きなバッファーを使用します。これが、リダイレクトなしではこれが表示されない理由です。

于 2013-05-08T08:37:54.667 に答える
0

これを試して:

#include <stdio.h>
main (void) {
printf("Hello world\n");
fflush(stdout); // <--
while(1);
}

出力ストリームの場合fflush()、ストリームの基になる書き込み関数を介して、指定された出力または更新ストリームのすべてのユーザー空間のバッファリングされたデータの書き込みを強制します。

于 2013-05-08T08:39:17.550 に答える