프로세스 종료

프로세스를 종료하면 다음과 같은 결과가 발생합니다.

  • 프로세스의 나머지 스레드는 종료로 표시됩니다.
  • 프로세스에 의해 할당된 모든 리소스가 해제됩니다.
  • 모든 커널 개체가 닫힙니다.
  • 프로세스 코드가 메모리에서 제거됩니다.
  • 프로세스 종료 코드가 설정됩니다.
  • 프로세스 개체에 신호가 전송됩니다.

커널 개체에 대한 열린 핸들은 프로세스가 종료될 때 자동으로 닫히지만 개체 자체는 열려 있는 모든 핸들이 닫힐 때까지 존재합니다. 따라서 다른 프로세스에 열려 있는 핸들이 있는 경우 개체를 사용하는 프로세스가 종료된 후에도 개체가 유효한 상태로 유지됩니다.

GetExitCodeProcess 함수는 프로세스의 종료 상태 반환합니다. 프로세스가 실행되는 동안 종료 상태 STILL_ACTIVE. 프로세스가 종료되면 종료 상태 STILL_ACTIVE 프로세스의 종료 코드로 변경됩니다.

프로세스가 종료되면 프로세스 개체의 상태가 신호를 받고 프로세스가 종료되기를 기다리던 스레드를 해제합니다. 동기화에 대한 자세한 내용은 여러 스레드의 실행 동기화를 참조하세요.

시스템에서 프로세스를 종료하는 경우 프로세스가 만든 자식 프로세스를 종료하지 않습니다. 프로세스를 종료해도 WH_CBT 후크 프로시저에 대한 알림이 생성되지 않습니다.

SetProcessShutdownParameters 함수를 사용하여 시스템 종료 시 프로세스 종료의 특정 측면을 지정합니다(예: 시스템의 다른 프로세스에 비해 프로세스가 종료되어야 하는 경우).

프로세스가 종료되는 방법

프로세스는 다음 이벤트 중 하나가 발생할 때까지 실행됩니다.

  • 프로세스의 모든 스레드는 ExitProcess 함수를 호출합니다 . 프로세스의 기본 스레드가 반환되는 경우 CRT(C 런타임 라이브러리)의 일부 구현은 ExitProcess 를 호출합니다.
  • 프로세스의 마지막 스레드가 종료됩니다.
  • 모든 스레드는 프로세스에 대한 핸들을 사용하여 TerminateProcess 함수를 호출합니다.
  • 콘솔 프로세스의 경우 콘솔이 Ctrl+C 또는 Ctrl+BREAK 신호를 받으면 기본 콘솔 제어 처리기가ExitProcess 를 호출합니다.
  • 사용자가 시스템을 종료하거나 로그오프합니다.

스레드가 알려진 상태에 있지 않으면 프로세스를 종료하지 마세요. 스레드가 커널 개체에서 대기하는 경우 대기가 완료될 때까지 종료되지 않습니다. 이로 인해 애플리케이션의 응답이 중지될 수 있습니다.

주 스레드는 프로세스가 종료되기 전에 ExitThread 를 호출하도록 지시하여 다른 스레드를 종료하지 않도록 방지할 수 있습니다(자세한 내용은 스레드 종료 참조). 주 스레드는 이후에 ExitProcess 를 호출하여 모든 스레드가 종료되도록 할 수 있습니다.

프로세스의 종료 코드는 ExitProcess 또는 TerminateProcess 호출에 지정된 값이거나 프로세스의 기본 또는 WinMain 함수에서 반환되는 값입니다. 심각한 예외로 인해 프로세스가 종료되는 경우 종료 코드는 종료를 발생시킨 예외의 값입니다. 또한 이 값은 예외가 발생했을 때 실행된 모든 스레드에 대한 종료 코드로 사용됩니다.

ExitProcess에 의해 프로세스가 종료되는 경우 시스템은 프로세스가 DLL에서 분리되고 있음을 나타내는 값으로 연결된 각 DLL의 진입점 함수를 호출합니다. 프로세스가 TerminateProcess에 의해 종료될 때 DLL에 알림이 표시되지 않습니다. DLL에 대한 자세한 내용은 Dynamic-Link 라이브러리를 참조하세요.

TerminateProcess에 의해 프로세스가 종료되는 경우 프로세스의 모든 스레드는 추가 코드를 실행할 기회 없이 즉시 종료됩니다. 즉, 스레드는 종료 처리기 블록에서 코드를 실행하지 않습니다. 또한 연결된 DLL은 프로세스가 분리되고 있다는 알림을 받지 않습니다. 한 프로세스가 다른 프로세스를 종료해야 하는 경우 다음 단계에서 더 나은 솔루션을 제공합니다.

  • 두 프로세스 모두 RegisterWindowMessage 함수를 호출하여 프라이빗 메시지를 만들도록 합니다.

  • 한 프로세스는 다음과 같이 BroadcastSystemMessage 함수를 사용하여 프라이빗 메시지를 브로드캐스트하여 다른 프로세스를 종료할 수 있습니다.

     DWORD dwRecipients = BSM_APPLICATIONS;
        UINT uMessage = PM_MYMSG;
        WPARAM wParam = 0;
        LPARAM lParam = 0;
    
        BroadcastSystemMessage( 
            BSF_IGNORECURRENTTASK, // do not send message to this process
            &dwRecipients,         // broadcast only to applications
            uMessage,              // registered private message
            wParam,                // message-specific value
            lParam );              // message-specific value
    
  • 프라이빗 메시지를 받는 프로세스는 ExitProcess 를 호출하여 실행을 종료합니다.

ExitProcess, ExitThread, CreateThread, CreateRemoteThreadCreateProcess 함수의 실행은 주소 공간 내에서 직렬화됩니다. 다음 제한 사항이 적용됩니다.

  • 프로세스 시작 및 DLL 초기화 루틴 중에는 새 스레드를 만들 수 있지만 프로세스에 대한 DLL 초기화가 완료될 때까지 실행을 시작하지 않습니다.
  • 한 번에 하나의 스레드만 DLL 초기화 또는 분리 루틴에 있을 수 있습니다.
  • ExitProcess 함수는 DLL 초기화 또는 분리 루틴에 스레드가 없을 때까지 반환되지 않습니다.