내가 이해하는 것처럼 좀비 프로세스는 종료되었지만 부모 (또는 init
좀비 자체가 고아 인 경우)가 종료 상태를 확인할 때까지 프로세스 테이블에 자리 표시 자로 존재 합니다.
그리고 고아 프로세스에 대한 나의 이해는 여전히 살아 있고 실행 중이지만 부모가 죽은 프로세스입니다.
좀비가 이미 죽었 기 때문에 아이들은 고아로 간주 될 것입니다. 그들은 좀비를 수확 영향을받을 것입니까? 구체적으로, init
좀비를 수확 한 후에 만 자녀를 자녀로 입양하거나 부모가 좀비가되는 즉시 입양 할 수 있습니까?
답변
내가 이해하는 것처럼 좀비 프로세스는 종료되었지만 부모 (또는 좀비 자체가 고아 인 경우 초기화)가 종료 상태를 확인할 때까지 프로세스 테이블에 자리 표시 자로 존재합니다.
옳은.
그리고 고아 프로세스에 대한 나의 이해는 여전히 살아 있고 실행 중이지만 부모가 죽은 프로세스입니다.
옳은.
좀비가 이미 죽었 기 때문에 아이들은 고아로 간주 될 것입니다.
예. 부모가 죽으면 죽었어 자녀와 관련하여 부모가 좀비로 남아 있는지 여부는 중요하지 않습니다. 자녀가 부모가 죽을 때 고아가 된 다음 부모와의 연결이 끊어집니다.
그들은 좀비를 수확 영향을받을 것입니까? 구체적으로, 좀비를 수확 한 후에 만 자녀를 자녀로 입양하거나 부모가 좀비가 된 즉시 입양 할 수 있습니까?
위와 같이 후자가 아닙니다.
답변
실험 결과가 나오면 최소한 systemd
init가 가능한 한 빨리 좀비의 고아를 얻을 것입니다.
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