2011-06-03 23 views
0

I fork()プロセスXとYに、その後Y forks()を再度実行し、Zを複数回処理します。フォークによって生成されたプロセス孫を待つ/または終了させる

今プロセスYは「リスナー」の一種であり、私はXをDeleterにしたいと考えています。 Zプロセスは実際のアクションを実行します。 ZプロセスはXの孫である。

FIFOといくつかのシグナリングでは、XはZプロセスのすべてのpidのリストを生成した。問題は今、私がZを使ってZプロセスゾンビを削除したいということです(pidのリストを参照)。

私はwaitpid()で試しましたが、もちろん動作しません(直接の子供の場合のみ)。しかし、私はこれについて自分自身で拡張を行う可能性について読んだ。しかし、私は本当にそれを行う方法を知りませんでした。

ゾンビで別のリストを保持していると思っていますが(これは終了時の信号ですが)これは私がpidを保存したのと同じです。別の方法でやりたいと思います。

どのようにすればいいですか?

答えて

1

あなたの質問は、実際の問題を理解しにくくする素晴らしい仕事です。それでも、私は次のことを見分けることができると信じています。「私はゾンビを取り除きたい」。さて、私たちは皆ではありません。

  • YSIGCHLDを無視しておいてください。

    は、複数のこれを行う方法があります。彼らはYが定期的にどんな子供

用(wait)を享受しまし

  • を死ぬときforked子供たちがゾンビになりませんそれはあなたが使用して1あなたの選択だが、最初はあなたが望むものであるように思えます。

  • 2

    遠隔の第N世代の孫から終了ステータスを取得できる唯一のプロセスは「init」プロセスであり、カーネルによって実装される特殊なルールです。

    一般に、プロセスでは直接の子どもたちが死ぬのを待つだけです。子供の子孫が死ぬのを待つことはできません。

    病的ビジネス...


    あなたがプロセスYコードを担当している、またはそれに影響を与えることができる場合Zプロセスがゾンビを作成しないように、おそらくそのプロセスはsignal(SIGCHLD, SIG_IGN)を設定する必要があります。プロセスXは、Yプロセスをフォークしている間に、fork()の後の子プロセスでSIGCHILDを無視し、Yプロセスのいずれかのexec*()の前にプロセス自身を実行することさえできます。これは、Yプロセスが明示的にSIGCHLDの異なるハンドラを設定した場合にのみオーバーライドされます。 Yコードが明示的にSIGCHLD処理を設定し、実際にゾンビを収集しない場合(Zプロセス)、Yコードでバグを報告できます。

    1

    これはサポートされていません。あなたの唯一の目的が「Z」プロセス(すなわち、、孫)がゾンビに変わるのを防ぐには、setsid()を使うことができます。ただし、実際に終了ステータスが必要な場合は、実際に 'Y'プロセスから取得する必要があります。

    関連する問題