Windows - Procesy (Processes)

Aplikace pro Windows se skládá z jednoho nebo více procesů. Proces je jednoduše řečeno spuštěný program. Každý proces poskytuje zdroje nutné k vykonávání programu.
Proces má vituální adresový prostor, kód, data, proměnné prostředí, prioritu, atd.

#include <windows.h> - pro všechny funkce Win32 API

Vytvoření procesu

CreateProcess
  • vytvoří nový proces jako potomka rodičovského procesu, oba běží nezávisle na sobě
  • vrátí strukturu PROCESS_INFORMATION informací o novém procesu do lpProcessInformation, např. handle (který je platný dokud se neuzavře, tedy i po ukončení procesu)
  • vrací nenulovou hodnotu, při chybě 0
  • vlastnosti nového procesu lze nastavit pomocí struktury STARTUPINFO:
    • pro GUI procesy: výšku, šířku a pozici okna, které se použijí jako defaultní hodnoty funkce CreateWindow, nCmdShow parametr pro funkci ShowWindow
    • pro konzolové procesy velikost okna a bufferu (ve znacích), pozici, barvy textu a pozadí, titulek konzole
  • lpCommandLine - příkazový řádek, tj. jméno programu s parametry
  • bInheritHandles - jestli potomek zdědí handly
  • dwCreationFlags - další nastavení, např.
    • CREATE_NEW_CONSOLE - potomek na novou konzoli, nemůže se používat s DETACHED_PROCESS
    • DETACHED_PROCESS - pro konzolové procesy je bez konzole rodiče, nemůže se používat s CREATE_NEW_CONSOLE
    • CREATE_SUSPENDED - hlavní vlákno procesu se vytvoří pozastavené
    • priorita - defaultní NORMAL_PRIORITY_CLASS, pokud má rodič IDLE_PRIORITY_CLASS, tak tato
  • lpStartupInfo - STARTUPINFO struktura
  • lpProcessInformation - PROCESS_INFORMATION struktura

PŘÍKLAD

Př. Napište program a spusťte z něj nový konzolový proces s prioritou IDLE_PRIORITY_CLASS.

CreateProcessAsUser
  • vytvoří nový proces, který poběží pod jiným uživatelem, specifikovaným pomocí hToken

GetCurrentProcessId
  • vrací pid procesu

Př. Vypište pid procesu.

OpenProcess
  • vrací handle procesu na základě pid, při chybě NULL
  • bInheritHandle - jestli může být handle děděn
  • dwProcessId - id procesu

GetCurrentProcess
  • vrací pseudo handle procesu, který je použitelný jen v rámci tohoto procesu !, lze jej "zveřejnit" na normální handle pomocí DuplicateHandle

Př. Zjistěte handle, pseudo handle a "zveřejněný" pseudo handle procesu a porovnejte je s handlem z PROCESS_INFORMATION

Informace o procesu

GetStartupInfo
  • vrací STARTUPINFO strukturu, použitou při vytvoření procesu, do lpStartupInfo

Nový proces může od rodiče zdědit různé vlastnosti a zdroje, a rodičovský proces může určit, co se může zdědit. Potomek může dědit:

nedědí:

Aby se handl zdědil, musí se zděditelnost specifikovat při jeho vytváření, otevírání nebo duplikování a při volání funkce CreateProcess s parametrem fInheritHandles. Zděděný handl je stejný jako původní, změna na jednom se projeví i na druhém.

Ukončení procesu

ExitProcess
  • ukončí tento proces s návratovým kódem uExitCode

TerminateProcess
  • ukončí jiný proces, jehož handle je hProcess, s návratovým kódem uExitCode
  • vrací nenulovou hodnotu, při chybě 0

Proces se též ukončí, když skončí jeho hlavní nebo poslední vlákno. Handly otevřených souborů a jiné jsou při ukončení procesu uzavřeny, ale stále existují, pokud je používají i jiné procesy.
Konzolové procesy lze také ukončit pomocí C-C nebo C-Break.

GetExitCodeProcess
  • vrací status ukončení procesu, jehož handle je hProcess, do lpExitCode, je STILL_ACTIVE, pokud proces ještě běží, nebo je to návratový kód procesu, který vrací main nebo WinMain funkce
  • vrací nenulovou hodnotu, při chybě 0

Př. Vypište v rodiči návratový kód potomka.

TerminateProcess neukončuje korektně vlákna, pro ukončení procesu jiným by se mělo postupovat takto:

Při ukončení procesu se neukončují jeho potomci.

Další funkce týkající se procesů jsou:



Jan Outrata
outrata@phoenix.inf.upol.cz