9

だから私は次のことをしたい:
たくさんのプロセスをフォークするデーモンをセットアップする。

したがって、デーモンは一連のプロセスをフォークしてから、別の一連のプロセスをフォークします

問題は、子プロセスが終了するまでに長い時間がかかる可能性があることです。子をフォークしているにもかかわらず、親プロセスに他の作業がある場合、ゾンビの子を防ぐにはどうすればよいですか?

親プロセス(デーモン)は次のようなことを行います。

while(true)
{
SQL QUERY EXECUTED

   while(mysql_fetch_array)
   {
       Fork children
   }
}

問題は、親プロセスが子をフォークする以外に他の作業を行う必要がある場合、および子が終了するのに長い時間がかかる場合に、子プロセスが終了するのをどのように待つことができるかです。

システムデーモンのPEAR関数を使用してデーモンを作成し、pcntl_fork関数を使用してプロセスを作成しています。

4

3 に答える 3

4

私はこれを見た場所を覚えていません:

Parent forks child
  Waits until child is dead  (this won't take long, see ahead)
  Goes on

Child does only 2 things:
  Forks a grandchild
  Exits

Grandchild does whatever work is needed
  Exits

秘訣は、Granchildが死んだとき、その親(あなたの子供の1人)はすでに死んでいるということです。しかし、誰かが死について通知されなければなりません。Linuxシステムでは、通知されるのは祖父母ではなく、すべての祖父母であるように見えます。そして、そのプロセスはその仕事を知っているので、定期的に死んだ子供をチェックし、彼らがゾンビになることを許可しません。

説明付きのリンクは次のとおりです:http://fixunix.com/unix/533215-how-avoid-zombie-processes.html

プロセスの親が終了すると、「init」プロセスがその親として引き継ぎます。したがって、子プロセスが終了すると、孫は親を失い、initに養子縁組されます。Initは常に死んだ子供たちを刈り取るので、彼らはゾンビにはなりません。

于 2011-11-10T23:19:31.213 に答える
2

親に子供を待つ以外に何もさせないことを検討する必要があります。親が何らかの理由で死亡した場合、子供はゾンビになります。ただし、親が何もしなかった場合、予期せずに死亡する可能性はほとんどありません。

于 2011-11-10T21:04:46.333 に答える
0

SIGCHLDハンドラーをSIG_IGN(ではなく)に明示的に設定するSIG_DFLと、終了コードに関心がないと仮定して、子がゾンビプロセスになるのを防ぐことができます。または、新しいLinuxでは、代わりにsigactionSA_NOCLDWAITフラグを使用する必要があります。

于 2011-11-10T22:11:50.887 に答える