좀비가 고아를 가질 수 있습니까? 좀비를 수확하여 고아 아이들이 방해받을 것인가?


27

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

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

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


init부모가 죽 자마자 자식 프로세스가 보호되는 것이 합리적입니다 . 좀비는 아이들을 돌보지 않습니다. 아무것도하지 않습니다. 그 pid자리에 떠있는 사망 상태 정보 일뿐 입니다.
PSkocik

좀비의 고아는 좀비가 될 수 없다는 것을 의미합니까 init?
와일드 카드

옳은. 또는 그들이 좀비가되면, 그것들이 init거두어 질 때까지 아주 적은 시간 동안 만있을 것입니다.
PSkocik

6
이 질문의 제목이 "Hot Network Questions"섹션에 나타날 때까지 기다릴 수 없습니다 ...
Nathan Osman

@NathanOsman, 그것은 훌륭했을 것입니다. :(
와일드 카드

답변:


15

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

옳은.

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

옳은.

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

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

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

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


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;
}

한 터미널에서 :

$ 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

그리고 그것은 그 일입니다.
Gilles 'SO- 악의를 멈춰라'

@Gilles 확실히, 고아를 모으는 것은 초기 작업이지만, 언제 수집 해야하는지 지정하는 표준이 있습니까? 그렇지 않으면 구현에 약간의 여유가 있다고 상상할 수 있습니다.
muru December

나는 그것에 대한 서면 표준이 없다고 생각합니다. POSIX 는“기존 프로세스의 모든 기존 자식 프로세스와 좀비 프로세스의 부모 프로세스 ID는 구현 정의 시스템 프로세스의 프로세스 ID로 설정되어야합니다.”라고만 말합니다. 해야 할 일, 심지어 그 시스템 프로세스에 정보를 제공하는 방법. Unix 시스템에서 해당 시스템 프로세스는 PID 1이고 SIGCLD를 수신하며 처리 되 자마자 프로세스를 거칩니다.
Gilles 'SO- 악의

@Gilles는 좀비가 사라질 때까지 좀비의 아이들을 수확하는 것을 연기하기로 결정한 어딘가에 (아마도 kinemortophobic) init가있을 수 있음을 의미합니까?
muru December

Gilles에게 unix.stackexchange.com/a/177361/5132 를 상기시켜 줄 수도 있습니다 . 지금은 거의 4 년입니다. ☺
JdeBP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.