좀비가 고아를 가질 수 있습니까? 좀비를 수확하여 고아 아이들이 방해받을 것인가? 때까지 프로세스 테이블에

내가 이해하는 것처럼 좀비 프로세스는 종료되었지만 부모 (또는 init좀비 자체가 고아 인 경우)가 종료 상태를 확인할 때까지 프로세스 테이블에 자리 표시 자로 존재 합니다.

그리고 고아 프로세스에 대한 나의 이해는 여전히 살아 있고 실행 중이지만 부모가 죽은 프로세스입니다.

좀비가 이미 죽었 기 때문에 아이들은 고아로 간주 될 것입니다. 그들은 좀비를 수확 영향을받을 것입니까? 구체적으로, init좀비를 수확 한 후에 만 ​​자녀를 자녀로 입양하거나 부모가 좀비가되는 즉시 입양 할 수 있습니까?



답변

내가 이해하는 것처럼 좀비 프로세스는 종료되었지만 부모 (또는 좀비 자체가 고아 인 경우 초기화)가 종료 상태를 확인할 때까지 프로세스 테이블에 자리 표시 자로 존재합니다.

옳은.

그리고 고아 프로세스에 대한 나의 이해는 여전히 살아 있고 실행 중이지만 부모가 죽은 프로세스입니다.

옳은.

좀비가 이미 죽었 기 때문에 아이들은 고아로 간주 될 것입니다.

예. 부모가 죽으면 죽었어 자녀와 관련하여 부모가 좀비로 남아 있는지 여부는 중요하지 않습니다. 자녀가 부모가 죽을 때 고아가 된 다음 부모와의 연결이 끊어집니다.

그들은 좀비를 수확 영향을받을 것입니까? 구체적으로, 좀비를 수확 한 후에 만 ​​자녀를 자녀로 입양하거나 부모가 좀비가 된 즉시 입양 할 수 있습니까?

위와 같이 후자가 아닙니다.


답변

실험 결과가 나오면 최소한 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;
}

한 터미널에서 :

$ 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