1

このSO投稿とこのに基づいて、fork()を使用すると、system/execvpを非ブロッキング方式で実行できるようになると思います。ただし、上記のサンプルコードでフォークブロックで長時間実行される子プロセスを発行しようとすると、子が終了するまで、コントロールは親ブロックに戻りません。

C / C ++コードで、システムへの非ブロッキング呼び出しを許可するコードをどのように設計する必要があるか、メソッドを教えてください。また、同じ親から複数の子供がフォークされるプログラムを作成する予定です。どうすれば子供たちのpidを取得できますか?

あなたの親切な助けに感謝します。

4

2 に答える 2

3

forkすぐに子と親の両方に戻ります。ただし、その例(test3.c)の呼び出しはwait4、聞こえるように、別のプロセスが何かを実行するのを待ちます(この場合は終了します)。

于 2012-04-08T21:19:46.253 に答える
1

言及されたサンプルコードは、スポーン後に子が戻るのを待ちます-それがブロックする理由です。

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

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

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

于 2012-04-08T21:36:07.953 に答える