저는 WSL에서 좀비 프로세스를 가지고 놀고 있습니다. 나는 매우 간단한 프로그램을 작성했습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define CHILD 0
int main(){
int p;
p = fork();
if(p == CHILD){
printf("Kind-PID: %u\n", getpid());
exit(1);
} else if(p > CHILD){
sleep(30);
}
else return EXIT_FAILURE;
return EXIT_SUCCESS;
}
기본 Linux에서 ps
좀비 프로세스를 보는 데 사용할 수 있지만 WSL에서는 좀비 프로세스를 볼 수 없습니다 . 누구든지 이유를 설명할 수 있나요?
답변1
면책 조항: 저는 WSL의 내부 작동에 대해 아무것도 모릅니다. Windows 프로세스 수명 주기의 세부 사항에 대해 제가 아는 것은 빠른 Google 검색의 결과뿐입니다. 저를 정정해 주시기 바랍니다.
Linux에서 프로세스 상태는 PID 번호를 결정하는 프로세스 테이블 항목을 사용하여 Unix 스타일로 추적됩니다. 따라서 프로세스가 종료되면 (실제 또는 채택된) 상위 프로세스가 죽어가는 프로세스의 종료 코드를 읽을 때까지 프로세스 테이블 항목을 지울 수 없습니다. 즉, PID 번호는 그대로 유지됩니다. 프로세스가 종료되었지만 종료 코드가 아직 읽혀지지 않았음을 나타내는 프로세스 테이블 항목을 위치라고 합니다.좀비상태. 시스템의 모든 프로세스는 이 상태와 프로세스 테이블에 있는 다양한 기타 정보에 액세스할 수 있습니다.
Windows에서는 다음을 통해 프로세스 정보에 액세스합니다.프로세스 핸들. 또한 실행 중인 프로세스에도 프로세스 ID가 있습니다. 프로세스가 종료되면 종료 코드는 종료된 프로세스의 핸들에 저장되어 PID 번호와 별도로 관리되므로 즉시 PID 번호를 재활용할 수 있습니다. PID 번호와 달리 프로세스 핸들은 소유자가 프로세스를 닫을 때까지 유효하며 참조하는 프로세스가 종료되어도 프로세스 핸들이 무효화되지는 않습니다.
WSL에서 "좀비" 상태에 해당하는 것을 충실하게 표시하려면 WSL ps
명령은 좀비 프로세스에 대한 다른 모든 WSL 프로세스의 핸들을 확인한 다음 해당 프로세스가 활성 상태인 경우 프로세스에서 사용하는 PID 번호를 어떻게든 가져와야 합니다. WSL 하위 시스템이 활성화된 동안 Windows 프로세스 테이블에서 프로세스를 구체적으로 복사하지 않으면 더 이상 존재하지 않습니다.
그러나 프로세스 핸들이 반드시 공개 정보인 것은 아닙니다. WSL이 구현되는 방식에 따라 WSL 프로세스는 자체 하위 프로세스의 좀비만 볼 수도 있고, 동일한 사용자에 속한 좀비만 볼 수도 있고, 임의의 하위 프로세스의 좀비일 수도 있습니다. WSL 프로세스에만 해당됩니다. Unix 스타일 좀비 프로세스의 모양을 재현하려면 WSL이 시스템의 각 WSL 프로세스에 대한 핸들을 유지해야 할 수도 있습니다.
그러나 이론상으로는 죽은 WSL 프로세스의 Windows PID는 다른 라이브 프로세스로 재활용될 수 있으며, 죽은 프로세스의 종료 코드를 읽기 전에 죽은 WSL 프로세스의 (실제 또는 채택된) 상위 프로세스는 시간이 걸립니다. 그렇다면 WSL은 무엇을 좀비의 PID로 보고해야 할까요? 다른 활성 프로세스에서 이미 사용 중인 PID를 보고하는 것은 분명히 나쁜 습관입니다. 좀비가 살아 있을 때 실제 PID와 다른 PID를 사용하여 보고하는 것도 올바르지 않습니다.
좀비 프로세스에 대해 실제로 할 수 있는 일이 없고 좀비 프로세스가 PID 번호 공간을 복잡하게 만들지 않으므로 WSL이 유효한 옵션일 수 있습니다.좀비 프로세스의 개념을 완전히 재현하려는 시도는 전혀 없습니다..ps