답변:
좀비 프로세스는 이미 죽었습니다. 당신은 그들을 죽일 수 없습니다. kill
명령 또는 시스템 호출은 좀비 프로세스에 영향을주지 않습니다. (좀비를 버릴 kill
수는 있지만 잠시 후에 보 겠지만 좀비가 아닌 부모를 쏴야합니다.)
좀비 프로세스는 실제로 프로세스가 아니며 프로세스 테이블의 항목 일뿐입니다. 좀비 프로세스와 관련된 다른 리소스는 없습니다. 메모리 나 실행중인 코드가 없으며 열려있는 파일이 없습니다.
프로세스가 종료되면 다른 모든 리소스를 정리 한 후 마지막으로 수행해야 할 것은 프로세스 테이블의 항목입니다. 이 항목은 좀비를 형성하여 부모 프로세스가 자식의 종료 상태를 추적 할 수 있도록 유지됩니다. 부모 wait
는 syscall 패밀리 중 하나를 호출하여 종료 상태를 읽습니다 . 이 시점에서 좀비가 사라집니다. 전화 wait
는 아이 를 거두어 죽은 좀비의 은유를 확장하지만 어떤 식 으로든 여전히 내세로 완전히 처리되지는 않는다고합니다. 부모는 SIGCHLD 신호를 무시하거나 플래그 로 호출 sigaction
하여 상관하지 않음을 나타낼 수도 있습니다 SA_NOCLDWAIT
.이 경우 자식이 죽으면 프로세스 테이블의 항목이 즉시 삭제됩니다.
따라서 좀비는 프로세스가 종료되고 해당 부모가 wait
아직 호출 되지 않은 경우에만 존재합니다 . 이 상태는 부모가 여전히 실행중인 동안에 만 지속될 수 있습니다. 부모가 자식보다 먼저 죽거나 자식의 상태를 읽지 않고 죽으면 좀비의 부모 프로세스는 PID 1 인 프로세스로 설정됩니다 init
. 작업 중 하나는 루프 init
를 호출 wait
하여 부모가 남긴 좀비 프로세스를 얻는 것입니다.
프로세스의 부모가 죽 자마자 프로세스는 고아가되어 좀비인지 아닌지를 무시합니다. 고아는 어떻게 되나요? 그들은이라는 새로운 부모를 얻습니다 init
. init
것이다 wait
그것을 따라서 고아 베기, 수집하는 각 고아에 (즉,도 아니라 좀비일지도 모른다).
init
죽이지 않는 어떤 과정을.wait
자녀의 신분을 수집하는 것만 입니다.