2012-04-08 5 views
1

このSO postと、これに基づいて、このexampleを使用すると、fork()を使用するとsystem/execvpをノンブロッキングで実行できます。しかし、上記のコード例でforkブロックで長期実行の子プロセスを実行しようとすると、子プロセスが終了するまで、コントロールは親ブロックに戻りません。フォークを使用したC++プログラムのノンブロッキングシステムコール

C/C++コードでシステムにノンブロッキング呼び出しを許可するようにコードを設計する方法を教えてください。また、同じ親から2人以上の子供が分かれているプログラムを書くつもりです。どうやって子供たちの子供を得ることができますか?

ご協力ありがとうございます。

+1

あなたがしていることを説明するためにいくつかのコードを追加してください。 –

答えて

3

forkは、すぐに子と親の両方に戻ります。しかし、この例(test3.c)ではwait4が呼び出されますが、それは他のプロセスが何かを行うのを待っています(この場合はexit)。

+0

ありがとうございます。それが問題を解決します。また、多くのプロセスを発行しなければならない場合は、同じforkメソッドが機能するかどうかを知ることができます。また、フォークを使用して子プロセスのpidを取得すると、0が返されます。正しいpidを取得するにはどうすればよいですか? – user984260

+2

これはforkの仕組みです。子プロセスのPIDを親プロセスに返し、ゼロプロセスプロセスのPIDを親プロセスに返します。これが起こらなかった場合、どのプロセスがどのプロセスであるかを知る(簡単な)方法はありません。基本的には、独自のPIDが必要な場合は、通常の方法で取得する必要がありますが、今は覚えていませんが、あなたはそれを参照できると確信しています。 –

+2

@ user984260 'fork'は親の新しいプロセスのPIDを返します。子プロセスでは0を返します。現在のプロセスのPIDを取得するには、 'getpid'を呼び出します。マニュアルページはあなたの友人です! –

1

サンプルコードでは、産卵後に子供が戻ってくるのを待っています。そのため、ブロックされています。

子プロセスのPIDを取得するには、fork()の戻り値を使用します。 fork()は、2つの異なる値を返す単一のシステムコードです.pidは親プロセスに、0は子プロセスに戻ります。このため、プログラム内の親子で実行されるコードブロックを区別することができます。

man fork(2)を参照してください。

fork()とwait()について注意しなければならないもう一つのことは、子プロセスの終了後にカーネルは何らかの理由で消費されるべき情報(終了ステータスなど)を保持していることです。さもなければ、そのようなプロセスは「ゾンビ」(ps出力ではZ)になります。これはwait *()呼び出しで行われる作業です。さらに、子プロセスの終了後、親プロセスはSIGCHLDを使用してカーネルによって通知されます。子プロセスの戻り値を処理したくない場合は、signal()、sigaction()などでSIGCHLDを無視することをシステムに通知できます。この場合、追加データは自動的に無効になります。このような動作はシステムではデフォルトになる可能性がありますが、プログラムの移植性を高めるために明示的にそのような動作を記述することをお勧めします。

関連する問題