共用方式為


終止進程

終止行程會產生下列結果:

  • 進程中的任何剩餘線程都會標示為終止。
  • 該程序所分配的任何資源都已釋放。
  • 所有核心物件都會關閉。
  • 進程程式代碼會從記憶體中移除。
  • 程序結束代碼已設定。
  • 進程對象會發出訊號。

當進程終止時,核心對象的開啟句柄會自動關閉,但物件本身會存在,直到所有開啟的句柄都關閉為止。 因此,如果另一個進程有開啟的句柄,物件會在使用該對象的進程終止之後維持有效狀態。

GetExitCodeProcess 函式會傳回進程的終止狀態。 當進程執行時,其終止狀態會STILL_ACTIVE。 當進程終止時,其終止狀態會從STILL_ACTIVE變更為進程的結束代碼。

當進程終止時,進程物件的狀態會變成訊號,釋放任何等候進程終止的線程。 如需同步處理的詳細資訊,請參閱 同步處理多個線程的執行

當系統終止進程時,它不會終止進程已建立的任何子進程。 終止進程不會產生WH_CBT攔截程式的通知。

使用 SetProcessShutdownParameters 函式來指定系統關機時進程終止的某些層面,例如當進程應該相對於系統中的其他進程終止時。

進程如何終止

進程會執行,直到發生下列其中一個事件為止:

  • 進程的任何線程會呼叫 ExitProcess 函式。 請注意,如果程序的主執行緒返回,某些 C 執行時庫 (CRT)的實作會呼叫 ExitProcess
  • 進程的最後一個線程會終止。
  • 任何線程都會使用程序的句柄調用 TerminateProcess 函式。
  • 針對控制台進程,當控制台收到 CTRL+C 或 CTRL+BREAK 訊號時,預設 控制台控件處理程式呼叫 exitProcess
  • 使用者關閉系統或登出。

除非進程處於已知狀態,否則請勿終止進程。 如果線程在核心物件上等候,則在等候完成之前,將不會終止它。 這可能會導致應用程式停止回應。

主要線程可以藉由指示它們呼叫 ExitThread ,以避免終止其他線程,從而防止導致進程終止(如需詳細資訊,請參閱 終止 Thread)。 主要線程之後仍可呼叫 ExitProcess,以確保所有線程都終止。

進程的結束代碼是呼叫 exitProcessTerminateProcess中指定的值,或是進程之 main 或 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 ,以終止其執行。

ExitProcessExitThreadCreateThreadCreateRemoteThread,以及 CreateProcess 函式的執行會在地址空間內串行化。 適用下列限制:

  • 在進程啟動和 DLL 初始化例程期間,可以建立新的線程,但在進程完成 DLL 初始化之前,它們不會開始執行。
  • 一次只能有一個線程位於 DLL 初始化或中斷連結例程中。
  • ExitProcess 函式不會返回,直到所有執行緒完成其 DLL 初始化或分離例程為止。