내가 이해하는 바에 따르면 좀비 프로세스는 종료되지만 상위 프로세스(또는 init
좀비 프로세스 자체가 고아 프로세스인 경우)가 종료 상태를 확인할 때까지 프로세스 테이블에 자리 표시자로 여전히 존재합니다.
고아 프로세스에 대한 제가 이해한 바는 이들이 아직 살아 있고 실행 중이지만 상위 프로세스가 종료된 프로세스라는 것입니다.
이제 좀비는 죽었고 그 아이들은 모두 고아가 되었죠? 좀비 수확이 영향을 받나요? 구체적으로 init
좀비를 수확한 후 자녀로 입양합니까, 아니면 부모가 좀비가 된 직후에 입양합니까?
답변1
내가 이해하는 바에 따르면 좀비 프로세스는 종료되지만 상위 프로세스(또는 좀비 자체가 고아 프로세스인 경우 init)가 종료 상태를 확인할 때까지 프로세스 테이블에 자리 표시자로 여전히 존재합니다.
옳은.
고아 프로세스에 대한 제가 이해한 바는 이들이 아직 살아 있고 실행 중이지만 상위 프로세스가 종료된 프로세스라는 것입니다.
옳은.
이제 좀비는 죽었고 그 아이들은 모두 고아가 되었죠?
예. 부모가 죽으면 죽습니다. 아이들에게는 부모가 좀비로 계속 존재하는지 여부는 중요하지 않습니다. 아이들은 부모가 죽으면 고아가 되고 부모와의 연락이 끊어집니다.
좀비 수확이 영향을 받나요? 구체적으로 init는 좀비를 수확한 후 자녀로 입양할 것인가, 아니면 좀비가 된 직후에 부모를 입양할 것인가?
아니요, 위에서 언급한 대로 후자입니다.
답변2
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