Sdílet prostřednictvím


Ukončení procesu

Ukončení procesu má následující výsledky:

  • Všechna zbývající vlákna v procesu jsou označena k ukončení.
  • Všechny prostředky přidělené procesem se uvolní.
  • Všechny objekty jádra jsou zavřené.
  • Kód procesu se odebere z paměti.
  • Nastaví se ukončovací kód procesu.
  • Objekt procesu je signalován.

Když se proces ukončí, otevřené popisovače objektů jádra se automaticky uzavřou, ale samotné objekty existují, dokud nejsou uzavřeny všechny otevřené popisovače. Objekt bude proto zůstávat platný i po ukončení procesu, který ho používá, pokud má jiný proces k němu otevřený popisovač.

Funkce GetExitCodeProcess vrátí stav ukončení procesu. Během provádění procesu je stav ukončení STILL_ACTIVE. Když se proces ukončí, stav ukončení se změní z STILL_ACTIVE na ukončovací kód procesu.

Když se proces ukončí, stav objektu procesu se signalizuje a uvolní všechna vlákna, která čekala na ukončení procesu. Další informace o synchronizaci naleznete v tématu Synchronizace provádění více vláken.

Když systém ukončuje proces, neukončí žádné podřízené procesy, které proces vytvořil. Ukončení procesu negeneruje oznámení pro procedury hákování WH_CBT.

Pomocí funkce SetProcessShutdownParameters určete určité aspekty ukončení procesu při vypnutí systému, například kdy by se proces měl ukončit vzhledem k ostatním procesům v systému.

Způsob ukončení procesů

Proces se spustí, dokud nedojde k jedné z následujících událostí:

  • Jakékoli vlákno procesu volá funkci ExitProcess. Všimněte si, že některá implementace C run-time knihovny (CRT) volá funkci ExitProcess, pokud se primární vlákno procesu ukončí.
  • Poslední vlákno procesu se ukončí.
  • Jakékoli vlákno volá funkci TerminateProcess s popisovačem k procesu.
  • U procesů konzoly obslužná rutina řízení konzoly volá ExitProcess, když konzola obdrží signál CTRL+C nebo CTRL+BREAK.
  • Uživatel vypne systém nebo se odhlásí.

Neukončujte proces, pokud jeho vlákna nejsou ve známých stavech. Pokud vlákno čeká na objekt jádra, nebude ukončeno, dokud se čekání nedokončí. To může způsobit, že aplikace přestane reagovat.

Primární vlákno se může vyhnout ukončení jiných vláken tím, že je nasměruje na volání ExitThread před tím, než způsobí ukončení procesu (další informace najdete v tématu Ukončení vlákna). Primární vlákno může nadále volat ExitProcess poté, aby se zajistilo, že budou ukončena všechna vlákna.

Ukončovací kód procesu je buď hodnota zadaná ve volání ExitProcess, nebo TerminateProcess, nebo hodnota vrácená hlavní nebo WinMain funkce procesu. Pokud je proces ukončen z důvodu závažné výjimky, ukončovací kód je hodnota výjimky, která způsobila ukončení. Tato hodnota se navíc používá jako ukončovací kód pro všechna vlákna, která se spouštěla, když došlo k výjimce.

Pokud je proces ukončen ExitProcess, systém volá funkci vstupního bodu každé připojené knihovny DLL s hodnotou označující, že proces se odpojí od knihovny DLL. Knihovny DLL nejsou upozorněny, pokud je proces ukončen TerminateProcess. Další informace o knihovnách DLL naleznete v tématu Dynamic-Link knihovny.

Pokud je proces ukončen TerminateProcess, všechna vlákna procesu jsou ukončena okamžitě bez šance spustit další kód. To znamená, že vlákno nespustí kód v ukončovacích obslužných blocích. Kromě toho nejsou žádné připojené knihovny DLL upozorněny, že se proces odpojuje. Pokud potřebujete, aby jeden proces ukončil jiný proces, následující kroky poskytují lepší řešení:

  • Oba procesy by měly volat funkci RegisterWindowMessage k vytvoření soukromé zprávy.

  • Jeden proces může ukončit druhý proces vysíláním privátní zprávy pomocí funkce BroadcastSystemMessage následujícím způsobem:

     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
    
  • Proces, který přijímá privátní zprávu, volá ExitProcess k ukončení svého spuštění.

Provádění funkcí ExitProcess, ExitThread, CreateThread, CreateRemoteThreada CreateProcess je serializováno v rámci adresního prostoru. Platí následující omezení:

  • Během spouštění procesu a inicializační rutiny knihovny DLL lze vytvořit nová vlákna, ale nespustí provádění, dokud se inicializace knihovny DLL pro proces nedokončí.
  • Ve fázi inicializace nebo odpojování DLL může být aktivní pouze jedno vlákno.
  • Funkce ExitProcess se nevrací, dokud neexistují žádná vlákna, která by byla ve své DLL inicializaci nebo rutiny odpojení.