2011-10-17 9 views
1

私のアプリケーションでは、子プロセスをたくさん作成しています。 fork()の後、私はプロセスファイルを開き、作成したプロセスのstdout/stderrをそのファイルを指すように設定してから、意図したプログラムを実行します。Linux - 子プロセスのファイルにバッファされたI/Oを破棄する

親プロセスが、子プロセスがprintfを実行したときに、flush()を呼び出さずにすぐに出力ファイルにフラッシュするような設定をするオプションはありますか?または、バッファされたI/Oを無効にするために子プロセス自体(execの前)から呼び出すことができるAPIはありますか?

+0

setvbufのマニュアルページを参照してください。stdoutをバッファなしに設定できます。 stderrはすでにバッファなしに設定されています。 –

答えて

0

ここでの問題は、printfがバッファされていることです。基礎となるファイル記述子は、そのようにはバッファされません(カーネルでバッファされますが、もう一方は同じカーネルバッファから読み込むことができます)。バッファリングはsetvbufを使用して、回答であったはずのコメントに変更することができます。

setvbuf(stdout, NULL, _IONBF, 0); 

あなたはstdinまたはstderrのためにこれを行う必要はありません。

これは親プロセスからは実行できません。これは、バッファが子プロセスによって作成されるためです。親プロセスは、stdout(Cライブラリの一部)ではなく、(カーネル内の)基礎となるファイル記述子を操作するだけです。

P.S.fflushを意味し、flushではありません。

+0

この回答はほとんど正しいです。 「カーネルでバッファされている」を除いて。 stdioファシリティ、 'printf()'、 'setvbuf()'はlibcにバッファリングされています。カーネルにはパイプとFIFOがバッファされていますが、ファイルへのリダイレクトが行われることが明示されています。 IOW、子プロセスが変更可能な場合、stdout上の 'setvbuf()'への指定された呼び出しは、子プロセスのメインの先頭に追加されるべきです。 (stderrはデフォルトではバッファリングされません) – Dummy00001

+0

@ Dummy00001: 'O_DIRECT'のような拡張子を使用しない限り、すべてのIOはカーネル内でバッファされます。この場合、書き込まれる前にディスクによってバッファリングされます。 –

+0

setvbuf()がexecを介して保持されていないように見えますか?私はこのようなものを持っています。if(fork()== 0){<一時ファイルを開き、stdout/errをこのファイルにリダイレクトします> setvbuf()execf()} execfコードのprintf呼び出しはまだバッファリングされています。 – Manohar

関連する問題