운영체제가 커널 오브젝트 소멸 시점을 결정하기 위해서는 일단 프로세스가 종료되어야 한다.
자식 프로세스의 종료코드는 자식 프로세스의 커널 오브젝트에 저장된다. 자식 프로세스가 종료될때 커널 오브젝트를 소멸시키면 문제가 발생할 수 있다.
GetExitCodeProcess 함수
GetExitCodeProcess 함수는 첫번째 인자로 전달된 핸들이 가리키는 프로세스가 반환하는 종료코드(Exit Code, 종료 상태를 알리는 값)을 얻기 위한 함수이다. 전달된 핸들의 프로세스가 종료되지 않고 실행중이라면, STILL_ACTIVE를 반환한다.
return에 의해 반환되는 값이나 exit 함수 호출시 전달되는 인자는 종료상황을 알리기 위해 사용된다. 일반적으로 종료코드 -1이나 0은 비정상적 종료를 알리고자 하는 경우에 많이 사용한다.
자식 프로세스의 종료코드는 자식 프로세스의 커널 오브젝트에 저장된다. 자식 프로세스가 종료될때 커널 오브젝트도 동시에 소멸된다면 부모 프로세스는 자식 프로세스의 종료코드를 얻을 수 없게 된다. 때문에 프로세스가 종료되었다고 해서 커널 오브젝트까지 동시에 소멸시키지는 않는다.
커널 오브젝트는 해당 커널 오브젝트를 참조하는 대상이 하나도 없을때 소멸시킨다.(windows 에서)
커널 오브젝트를 참조하는 프로세스가 하나라도 있을 시에는 커널 오브젝트는 소멸되지 않는다. Windows는 커널 오브젝트 소멸 시기를 결정하기 위해 UsageCount를 관리한다.
UsageCount는 커널 오브젝트에 접근가능한 대상의 수를 나타낸다.
프로세스는 생성과 동시에 커널오브젝트의 UsageCount가 1이된다. 그리고 자식 프로세스의 경우 UsageCount가 2가 된다. 왜냐하면 프로세스 본인과 부모 프로세스가 PROCESS_INFORMATION 구조체를 통해서 커널 오브젝트에 접근이 가능하기 때문이다.
프로세스는 GetCurrentProcess 함수 호출을 통해서 언제든 자신의 커널 오브젝트 참조를 위한 핸들을 얻을 수 있다. 그렇기 때문에 프로세스 생성시 Usage Count는 무조건 1 이상이다.
자식 프로세스가 종료되면 커널오브젝트에 접근하는 대상이 하나 줄기 때문에 Usage Count 값도 1 줄어든다.
CloseHandle 함수
CloseHandle 함수는 핸들을 반환하면서 커널 오브젝트의 Usage Count를 하나 감소시키는 기능을 지닌다.
프로세스의 경우 프로세스가 종료되는 시점에서도 UsageCount가 하나 감소한다.
CloseHandle 함수와 프로세스 종료는 별개이다. 프로세스 종료 요청시에 사용되는 함수는 TerminateProcess 이다. 이것은 강제 종료 요청함수이다.
바탕화면에 있는 아이콘을 더블 클릭해서 프로세스를 생성할 경우, 프로세스의 UsageCount는 2이다. 바탕화면도 일종의 프로세스이고 더블 클릭이라는 이벤트를 통해서 바탕화면 프로세스에게 프로세스 생성을 요청하는 것이기 때문이다.
'Programming > Windows System Programming' 카테고리의 다른 글
Signaled vs Non-Signaled (0) | 2020.07.11 |
---|---|
프로세스간 통신(IPC) 메일 슬롯 (0) | 2020.07.10 |
커널 오브젝트에 대한 이해 2 (0) | 2020.06.13 |
커널 오브젝트에 대한 이해 (0) | 2020.06.10 |
프로세스 생성 (0) | 2020.06.08 |