0

並列プロセスを実行して、少なくとも4人のユーザーを同時に処理したいと思います。

ob_end_flush();

for($i = 0; $i < 4; $i++)
{
   $pid=pcntl_fork();
   if ($pid == -1) {
      echo("Could not create a new child.");
      exit;
   } else if ($pid == 0) {
      //This will get excuted only in the child process
      echo 'parent1';
      sleep(5);
      echo 'parent2';
     exit;
   }
}

出力は次のようになります。

> php testscript.php
parent1
parent1
parent1
parent1
> parent2
parent2
parent2
parent2

現在起こっていることはparent1、スクリプトのコントロールが4回表示された後、失われ、新しい空のコマンドラインが開始された後です。さらに5秒間待った後、残りの出力が表示されます。

どうすればそれが起こらないようにすることができますか。好きなときにスクリプトを壊せるようにしたいと思います。

編集

CTRL + Cを押して端末経由で信号を送信した場合、スクリプトは停止しません。その瞬間に停止するようにスクリプトに通知する方法が必要です。

4

2 に答える 2

1

あなたは汚いゾンビ/親のいないプロセスを作成していますが、それらは確かにそれらも望まない他の人に採用されています=)

フォークで作業しているときは、現在のプロセス(スタック/ヒープおよびすべて)のコピーを作成し、それに新しいプロセスID(PID)を与え、その親ID(PPID)を独自のものとして設定していることを理解する必要があります。生成されたプロセスは子であると言います。ここで、これら4人の新しい子供たちの親は、見かけの仕事をすべて終え、やることが何も残っていないため、エラーなしで亡くなりました。ここで、シグナル、特にSIGCHLDシグナルが役立つ可能性があります。このシグナルは、子がすぐそばにいる親プロセスに送信されます。それを小さなイベント処理ループと組み合わせると、親は子供を優雅に管理できます\ o /

tl;drブログにフォークラッパーの例がありますhttp://codehackit.blogspot.be/2012/01/childpids-break-pcntlsignaldispatch.html

于 2012-06-10T17:41:28.570 に答える
0

カスタム方式で反応させたい場合は、pcntl_signalを使用してCTRL-Cのシグナルハンドラー( SIGINTに等しく、値は2)を設定する必要があります。

于 2012-06-10T14:52:57.230 に答える