2011-07-12 17 views
0

ほとんどの例では、「私はPIDを持つ子です」と表示しています。私は3人の子供をフォークしようとしています、各子供は3つの異なるプロセスを実行しています。それぞれの子供は別々のCプログラムです。したがってfork()の後にexec()を使用して呼び出す必要がありますが、問題は構文にあり、すべての子プロセスにpid = 0があるため、各子を参照する方法があります。フォーク子供3人ずつ別々のプロセスを実行する

答えて

0

getmypid()を使用して、子供にpidを取得します。フォークコールが子プロセスに0を返す:PHPで

for($i = 0; $i < 3; $i++) { 
    $pid = pcntl_fork(); 
    if ($pid == -1) { 
     die("Fork failed on loop #$i"); 
    } else if ($pid == 0) { 
     $mypid = getmypid(); // executes in the children 
     exec(... whatever this child has to run ...); 
    } else { 
     ... executes in the parent 
    } 
} 

なお、このことを、基本的な仕組みは、フォークを行い、かなり任意の言語で同じまま()。


フォロー:

... 
} else if ($pid == 0) { 
    $mypid = getmypid(); 
    switch ($i) { 
     case 0: 
      exec(... app #1 ...) 
     case 1: 
      exec(... app #2 ...) 
     case 2: 
      exec(... app #3 ...) 
    } 
} ... 

はあなたの3つのアプリを起動したい方法です。親スクリプトがfork()を呼び出すと、それぞれの子は異なる$ iで終わるので、あなたは$ iの値であなたがいる子を判断することができます。

+0

ありがとうございます!ここに拡張機能があります。私は本当にこの概念を理解するために私の脳を働かそうとしています。親プロセスは3つのプロセスをforkします。それぞれのプロセスは別々のCプログラムからの実行ファイルです。これらのプロセスは同時に実行する必要があります。親はいずれかが終了するのを待ちます。ですから、$ mypid = getpid();という3つの行があります。 exec(CHILD1); $ mypid = getpid();エグゼクティブ(CHILD2)など? – Vijay

+0

私は質問をしたときに私は明確ではないかもしれません。謝罪します。私は子供たちを変えたくない。私は私の親が3人の子供を作り、3人すべてが同時に動くようにしたい。それらの子どものうち2人は基本的に無限ループであり、1人の子供はファイルから文字を読みます。いずれかの子が終了するまで、親は待機します。したがって、3番目の子が完了すると、もう一方の子が終了しない場合でも、親は移動します。あなたの例における質問は、「私」が子供を参照するためにどのように働くのですか? – Vijay

+0

fork()を完璧なコピー機と考える。元のプロセスと子供のどちらがどちらであるかを知る唯一の方法は、シートが出てきた用紙トレイ(fork()の戻り値)を調べることです。親であれば、 main for()ループを実行し、別のフォークを起動します(またはループを終了します)。あなたが子供であれば、あなたが最初/ 2番目/ 3番目の子供であるかどうかを把握し、適切なプロセスをexec()します。 3人の子供はすべて同じ時間に実行され、それぞれが独自のPIDを持ち、それぞれが元のプロセスの子です。 –

関連する問題