인프런 커뮤니티 질문&답변

Seongc좋은ᅵᅵheol Kim님의 프로필 이미지
Seongc좋은ᅵᅵheol Kim

작성한 질문수

Windows 시스템 프로그래밍 - 기본

실행 중인 프로세스 열거

강사님 ExitProcess 와 TerminateProcess 에 대해 질문드립니다.

해결된 질문

작성

·

187

·

수정됨

0

ExitProcess 관련 메뉴얼에

  • 프로세스에서 종료된 스레드 중 하나에 잠금이 있고 로드된 DLL 중 하나의 DLL 분리 코드가 동일한 잠금을 획득하려고 하면 ExitProcess 를 호출하면 교착 상태가 발생한다. 라고 되어 있는데 중요한 애기 인거 같은데 무슨 애기인지 알 수 있는지 해서요?

  • DLL에서 ExitProcess 를 호출하면 예기치 않은 애플리케이션 또는 시스템 오류가 발생할 수 있다. DLL을 로드할 애플리케이션 또는 시스템 구성 요소와 이 컨텍스트에서 ExitProcess 를 호출하는 것이 안전한 경우에만 DLL에서 ExitProcess 를 호출해야 한다. 라고 되어 있는데 설명 부탁드릴 수 있느지요?

  • 아울러 ExitProcess 와 TerminateProcess 의 경우 프로그램이 할당한 메모리 등 자원 및 오픈한 handle 에 대한 처리는 어떻게 되는지요?

 

부탁드려 봅니다.

답변 2

1

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

프로세스(.exe)가 ExitProcess() 함수를 호출하면 실행파일(.exe)이 로드한 모든 DLL에 대해 DllMain() 함수를 호출하게 됩니다. 매개변수는 DLL_PROCESS_DETACH가 될 것이고 이 과정에서 DLL 언로드와 관련된 코드가 수행될 것입니다. 보통 할당받은 자원을 해제하거나 개방했던 각종 핸들을 닫는 등 정리 절차에 관한 코드가 수행되는 것일 일반적인데 이 과정에서 해제 코드가 멈추는 등 흐름이 멈춰버리면 DllMain() 함수는 반환하지 못합니다. 이 경우 ExitProcess()는 DLL이 언로드 되지 않은 것으로 간주하여 계속 반환되기를 기다리게 됩니다. 로드한 전체 DLL 중 단 하나라도 이런 일이 발생한다면 ExitProcess() 함수는 끝내 반환하지 못하게 되고 결과적으로 프로세스가 종료되지도 못합니다.

더 중요한 것은 DLL 언로드가 진행된다고 판단한 후 내부 스레드들을 종료시키는데 그 절차를 진행하지 못하므로 ExitProcess()를 호출한 스레드는 그 지점에서 흐름이 멈추지만 나머지 스레드들은 여전히 작동하게 됩니다. 물론 일부 해제된 DLL이나 자원 때문에 오류가 발생할 가능성이 높고 그로 말미암아 비정상 종료될 가능성이 있습니다만 장담 할 수는 없습니다.

그리고 TerminateProcess()든 ExitProcess()든 어떤 경우라도 프로세스가 종료되면 프로세스가 사용했던 모든 자원은 OS가 회수합니다. 메모리는 가상 메모리 시스템을 사용하기 때문에 완벽히 회수되며 각종 파일 및 커널 오브젝트 같은 자원들도 회수 됩니다. 참고하시기 바랍니다. 😄

0

감사합니다. 강사님

Seongc좋은ᅵᅵheol Kim님의 프로필 이미지
Seongc좋은ᅵᅵheol Kim

작성한 질문수

질문하기