2012-01-04 6 views
4

私はHP-UXを使用しています。それはまたにリダイレクトされている標準出力に他のプロセス印刷には影響を与えない、この場合、STDOUT上のsetvbufは他のプロセスに対して安全ですか?

setvbuf(stdout, NULL, _IONBF, 0); // turn off buffering for stdout 

:私は、コードのすべての行は、以下のコマンドを使用して、コア・ダンプの場合に印刷されていることを保証するために、標準出力にバッファリングを無効にしたいですいくつかのログファイル?私は、この変更が実行されているかどうかにかかわらず、ローカルであるかどうかを知りたい。また、プロセス内でバッファリングを無効にし、後でコード内で_IO_FBFを再度設定することはできますか? (各呼び出しの前にfflush)

PS:これはバッファリングを無効にし、I/Oパフォーマンスが悪化することは知っていますが、デバッグの目的でのみこれを実行したいと思います。

答えて

0

setvbuf呼び出しは、現在のプロセス内のstdioルーチンとexec'dではなくforkするすべての子プロセスにのみ影響します。

setvbufが同じストリームで複数回呼び出されたときにstdioがどのように応答するかは、C標準では指定されていないため、C実装間で移植したいコードで複数の呼び出しを発行しないでください。

+0

私はLinuxでこれを試していました。実際に何かをprintfするときは、fflush()を実行し、bufのサイズをゼロに設定してください。私はすべての出力がクラッシュ前の時点までstdoutにあることがわかります。今問題は、バッファサイズをもっと大きくすると反映されず、stdoutがまだバッファなしモードになっていることを確認できます。この問題を回避するために、私は(stdout)を閉じてもう一度開くよう計画していました。ただし、コンソールのファイル名はプラットフォームに依存しているようです(hp-uxでは/ dev/pts/0 inlinux、/ dev/stdout)。 stdoutのソースを見つけてそれを再び開くための簡単な解決策はありますか? – rApt0r

+1

dupを使用してstdoutがオープンされているものに掛ける方が簡単です。私。この踊りをする:saved = dup(1); fclose(stdout); dup(保存);クローズ(保存); stdout = fdopen(1、 "w"); stdioに関しては、以前と同じファイル/パイプ/デバイスを指しているが、新しいsetvbuf呼び出しを受け入れる準備ができている限り、新しく開いたstdoutがある。 –

関連する問題