이 예를 고려하십시오 -
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
pid_t pid = fork();
if (pid > 0)
{
printf("Child pid is %d\n", (int)pid);
sleep(10);
system("ps -ef | grep defunct | grep -v grep");
}
return 0;
}
이 예에서 하위 프로세스는 상위 프로세스가 종료될 때까지 좀비 상태로 유지됩니다. 어떤 프로세스에서도 수집되지 않고 이 좀비 프로세스를 어떻게 정리합니까?
$ ./a.out
Child pid is 32029
32029 32028 0 05:40 pts/0 00:00:00 [a.out] <defunct>
$ ps -p 32029
PID TTY TIME CMD
답변1
상위 프로세스가 종료되면 하위 프로세스는 이를 기다리고 프로세스 테이블을 정리하는 init(pid=1)에 의해 상속됩니다.
답변2
좀비 프로세스의 요점은 프로세스의 성능 데이터를 보유하기 위해 커널 데이터 구조에 자리 표시자를 남겨 두는 것입니다.
상위 프로세스가 wait(2)를 호출하면 상위 프로세스는 성능 데이터를 수집하고 커널은 데이터 구조를 해제합니다.
데이터를 가져오기 전에 상위가 종료되면 성능 데이터는 적절한 경우 상위의 자체 성능 데이터에 병합된 다음 상위의 상위에서 가져옵니다.
또한 상위 프로세스에 의해 종료된 하위 프로세스는 프로세스 1(종종 "init"라고 함)에 의해 상속되며, 프로세스 1은 wait(2)를 사용하여 나머지 데이터를 수집하여 커널이 데이터 구조를 해제할 수 있도록 합니다.