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
|
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:
-
handly otevřených souborů, bufferů, rour, procesů, vláken, mutexů,
semaforů, mapování souborů
- proměnné prostředí
- aktuální adresář
-
konzoli, pokud rodič není bez konzole nebo pokud si potomek nevytvoří novou
nedědí:
- pseudo handly
- prioritu
- GDI nebo USER handly, např. HBITMAP nebo HMENU
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:
-
oba procesy si zaregistrují privátní zprávu pomocí
RegisterWindowMessage
-
jeden ukončí druhého posláním této privátní zprávy pomocí
BroadcastSystemMessage
, př.
BroadcastSystemMessage(
BSF_IGNORECURRENTTASK, // do not send message to this process
BSM_APPLICATIONS, // broadcast only to applications
private message, // message registered in functionvious step
wParam, // message-specific value
lParam ); // message-specific value
- proces, co přijme zprávu, se ukončí pomocí
ExitProcess
Při ukončení procesu se neukončují jeho potomci.
Další funkce týkající se procesů jsou:
- GetCommandLine
- GetCurrentDirectory / SetCurrentDirectory
- GetEnvironmentStrings
- GetEnvironmentVariable / SetEnvironmentVariable
- FreeEnvironmentStrings
- GetProcessTimes
- GetPriorityClass / SetPriorityClass
- GetModuleFileName