Computer/OS

프로세스 종료

이재만박사 2016. 10. 13. 16:13

프로세스가 자기 자신을 종료하는 가장 간단한 방법


WM_CLOSE 메시지 보내기

DestroyWindow() 로 메인 윈도우 파괴

WM_DESTROY 에서 PostQuitMessage 를 호출하여 메시지 루프를 종료


이런 방법들에 의해 WinMain이 리턴되면 다음 함수를 호출하여 정리 작업 수행


VOID ExitProcess( UINT uExitCode );


이 함수가 호출되면 프로세스는 정리 작업에 들어가 즉각 종료


프로세스가 종료될 때는 다음의 작업이 진행


1, 프로세스와 연결된 모든 DLL을 종료시키기 위해 각 DLL의 DllMain 함수가 호출되며 DLL들은 스스로 정리작업


2. 모든 열려진 핸들을 닫는다


3. 실행중인 모든 스레드를 종료한다


4. 프로세스 커널 객체와 스레드 객체는 신호상태가 되며 이 객체를 기다리는 다른 프로세스는 대기 상태를 해제


5. 프로세스의 종료 코드는 STILL_ACTIVE 에서 ExitProcess() 가 지정한 종료값



다음 함수도 프로세스를 종료 시킬 수 있음


BOOL TerminateProcess( HANDLE hProcess, UINT uExitCode );


이 함수는 ExitProcess에 비해 종료 대상이 되는 프로세스의 핸들을 인수로 가짐

자기 자신이 아닌 다른 프로세스를 강제로 종료 시킬 수 있음


이 함수는 연결된 DLL에게 종료 사실이 통지 되지 않음

만약 DLL에서 대량의 메모리를 할당해 놓았거나 파일을 저장하지 않은 채로 가지고 있는 상황에서 이 함수로 강제로 프로세스를 종료한다면 정보를 잃어버릴 수도 있음

대상 프로세스는 자신이 종료된다는 것을 알지 못하며 어떠한 신호도 받지 못하므로 이저장 문서는 잃어버릴 것임


이 함수를 정상적인 프로세스의 종료에 사용하는 것은 바람직하지 않으며 어쩔 수 없이 강제로 종료해야 할 경우에만 사용


작업 관리자가 응답이 없는 프로세스를 강제 종료할 때 이 함수를 사용