ゾンビは孤児を持つことができますか?孤児たちはゾンビを刈り取ることによって邪魔されますか?


27

私が理解しているように、ゾンビプロセスは死んでいますが、親(またはinitゾンビ自体が孤児である場合)が終了ステータスを確認するまで、プロセステーブルにプレースホルダーとして存在しています。

そして、孤立プロセスについての私の理解は、それらはまだ生きていて実行されているが、親が死んだプロセスであるということです。

ゾンビはすでに死んでいるので、その子供は孤児とみなされますよね?彼らはゾンビを刈り取って影響を受けますか?具体的にはinit、ゾンビが刈り取られた後にのみ子としてそれらを採用するか、親がゾンビになるとすぐにそれらを採用しますか?


子プロセスがinit、親が死ぬとすぐに親に変更されるのは理にかなっています(ゾンビになることも含まれます)。ゾンビはその子供の世話をしません。何もしません。これは、あるpid場所に漂う死亡ステータス情報にすぎません。
PSkocik

それはゾンビの孤児がすぐに世話されるので、ゾンビになることができないことを意味しinitますか?
ワイルドカード

正しい。または、彼らがゾンビになった場合、それらがinit刈り取られるまでほんのわずかな期間です。
PSkocik

6
私は「ホットネットワークの質問」セクション...で、この質問のタイトルが示すまで待つことができない
ネイサン・オスマン

@NathanOsman、それは素晴らしかっただろうが、それはノーゴーのように見える。:(
ワイルドカード

回答:


15

私はそれを理解しているように、ゾンビプロセスは死んだが、その親(またはゾンビ自体が孤児である場合はinit)がその終了ステータスをチェックするまで、プロセステーブルのプレースホルダーとして存在します。

正しい。

そして、孤立プロセスについての私の理解は、それらはまだ生きていて実行されているが、親が死んだプロセスであるということです。

正しい。

ゾンビはすでに死んでいるので、その子供は孤児とみなされますよね?

はい。親が死ぬとき、それは死んでいます。子に関しては、親がゾンビのままかどうかは関係ありません。子は親が死んだときに孤児になり、親との接続を失います。

彼らはゾンビを刈り取って影響を受けますか?具体的には、ゾンビが刈り取られた後にのみ、initを子として採用しますか、または親がゾンビになったらすぐに採用されますか?

いいえ、上記の後者。


8

実験結果が成功する場合、少なくともsystemdinitはできる限り早くゾンビの孤児を刈り取るようです。

foo.c

#include <unistd.h>

int main(void)
{
    pid_t child = fork();
    if (child < 0)
        return -1;
    if (child == 0)
    {
        pid_t grand_child = fork();
        if (grand_child < 0)
            return -1;
        if (grand_child == 0)
            sleep (1000);
        else
            return 0;
    }
    else
        sleep (1000);
    return 0;
}

1つの端末で:

$ gcc -o foo foo.c
$ ./foo

別のターミナルで:

$ pgrep foo                         
25548
25549
25550
$ pstree -pa 25548
foo,25548
  └─(foo,25549)
$ pstree -psa 25550
systemd,1
  └─foo,25550
$ ps -o stat,pid -p $(pgrep -d, foo)
STAT   PID
S+   25548
Z+   25549
S+   25550

そして、まあそれはその仕事です。
ジル 'SO-悪であるのをやめる'

@Gillesは確かに、孤児を集めることはinitの仕事ですが、いつ孤児を集めるべきかを指定する標準はありますか?そうでなければ、実装に多少の余裕があると思います。
ムル

そのための標準が書かれているとは思わない。POSIXは、「呼び出しプロセスの既存のすべての子プロセスとゾンビプロセスの親プロセスIDは、実装定義のシステムプロセスのプロセスIDに設定されるものとする」と述べているだけです。行うことになっている、またはそのシステムプロセスがどのように通知されるかです。Unixシステムでは、そのシステムプロセスはPID 1であり、SIGCLDを受け取り、プロセスに到達するとすぐにプロセスを取得します。
ジル 'SO-悪であるのをやめる'

@Gillesは、ゾンビが消えるまでゾンビの子供を刈り取るのを延期することを決定するいくつかの(おそらくキネモトフォビックな)初期化がある可能性があることを意味しますか?
ムル

また、Gillesにunix.stackexchange.com/a/177361/5132を思い出させることもできます。もう4年です。☺
JdeBP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.