1

複数のフォークされたプロセス間で POSIX/Linux の標準エラーを共有する際に、バッファーの制限や特定のガイドラインはありますか?

perror("Some descriptor related error: ");

必要に応じて perror を呼び出すサーバー アプリケーションがあります。単一のプロセスとして、正常に動作します。fork で作成した複数のプロセスの場合、サーバーをしばらく実行すると (エラーが発生すると何度もエラーが表示されます)、エラーステートメントを連続して出力し始め、無限ループに陥ります。

それ以外の場合は、サーバーが正常に実行されることを print ステートメントをコメントアウトして確認しました。

したがって、標準エラーのバッファオーバーフローのようなシナリオがあり、しばらくすると不足する可能性があるようです。

perror に対してミューテックスやセマフォを使用したことはありません。

サーバー コードは大きく、複数のクライアント記述子を処理するために epoll を使用し、ワーカー プロセスのプールでクライアントを取得します。

4

1 に答える 1

1

I/O はプラットフォームによってはスレッドセーフである可能性がありますが、出力はマルチプロセスセーフstderrstdoutはないことに注意する必要があります...したがって、複数のプロセスが端末出力に書き込みを行っている場合、それらは終了します各書き込みをアトミックにするプロセス間同期メカニズムがない場合は、相互に上書きします。「アトミック」と言うとき、各プロセスからの各メッセージの全長を書き出したいという事実を指しています。それぞれがターミナル バッファにアクセスし、アトミックにバイト数を書き込みますが、ターミナル バッファ リソースをめぐって競合する次のプロセスに譲らなければならない前に、各メッセージのバイト数全体を書き込むわけではありません。

ここで、無限ループは単一のプロセスによって引き起こされる可能性があります...エラーステートメントをすべてコメントアウトした場合、サーバーが「完全に」動作していることをどのように知ることができますか? たとえば、フォークされたプロセスが 1 つだけデッドロックしている場合、残りのプロセスは問題なく、サーバーは「正常に」機能しているように見えますが、実際にはバグをマスクしただけで、バグを排除したわけではありません。

于 2012-07-24T15:41:15.723 に答える