2016-09-28 11 views
4

同じ名前の別のスレッドがあることは知っていますが、これは実際は異なる質問です。forkされたプロセスの実行順序

プロセスが複数回フォークするとき、親プロセスは子プロセスの前に実行を終了しますか?逆に?同時に?

例を示します。 1つの親プロセスを4つの子プロセスに分岐するforループがあるとします。そのforループの終わりに、私は親プロセスがいくつかのデータをパイプ経由で子供に与えることを望みます。データは各子プロセスのそれぞれの標準に書き込まれます。

子供がコードを実行する前に、親が最初にデータを送信しますか?これは重要なことです。無効な標準からの作業を開始したくないからです。

+1

プロセスが複数回フォークするとき、親プロセスは子プロセスの前に実行を完了しますか?逆に?同時に? - 同時に、スケジューラとその予測不能に依存します。 –

+0

子プロセスが終了して親プロセスが実行されるまで待機するにはwait関数呼び出しを使用できます –

+0

子プロセスのパイプはどのように取得していますか?これは 'popen()'のために設計されたものではありませんか? ( 'fork()'が返った後に、2つのプロセスが存在するはずです。その時点で、あなたが入っているプロセスがあれば、完全な子プロセスが有効なstdinとstdoutで存在するはずです) – ebyrob

答えて

0

これらは同時に実行されます。これは基本的にプロセスのポイントです。

mutexなどを調べて、並行処理に対処してください。

6

実行の順序は、特定のOSスケジューリング方針によって決定され、何も保証されません。プロセスを同期させるために、この目的のために設計されたプロセス間通信(IPC)のための特別な設備があります。上記のパイプは一例です。彼らは実際にの読み取りプロセスをで待機し、他のプロセスが書き込みを行い、(一方向の)同期ポイントを作成します。他の例は、FIFOとソケットです。より単純なタスクのために、wait()ファミリーのファンクションまたはsignalsを使用することができます。

+0

このコンテキストでは、関数の 'wait()'ファミリについて言及してはいけません。 –

+0

もう少し追加します。 –

1

プロセスが複数回フォークすると、親プロセスは子プロセスの前に実行を完了しますか?逆に?同時に? -

スケジューラとその予測不可能な状況に依存します。

Using pipe to pass integer values between parent and child

このリンクは、親プロセスと子の間でデータを共有することについて詳細に説明しています。 4つの子プロセスがあるため、各子プロセス間に異なる個別のパイプを作成する必要があります。

パイプに書き込まれるデータの各バイトは、一度だけ読み込まれます。パイプの読み取り側が開いているすべてのプロセスに重複することはありません。

Multiple child processes reading/writing on the same pipe

別の方法としては、データ転送のための共有メモリを試すことができます。