A folyamatok kezelése
Munka a folyamatokkal. CreateProcess és TerminateProcess függvények
Munka a folyamatokkal. CreateProcess és TerminateProcess függvények.
Annak érdekében, hogy bármely szokásos alkalmazásból létrehozzunk egy folyamatot, szükségünk van a CreateProcess funkcióra.
BOOL CreateProcess (
LPCTSTR lpApplicationName, // mutató a futtatható fájl nevére
LPTSTR lpCommandLine, // mutató a parancssorba
LPSECURITY_ATTRIBUTES lpProcessAttributes, // mutató a biztonsági tulajdonságok feldolgozásához
LPSECURITY_ATTRIBUTES lpThreadAttributes, // a mutató a szálbiztonsági attribútumokhoz
BOOL bInheritHandles, // mutató az öröklési zászlóra
DWORD dwCreationFlags, // létrehozása zászlók
LPVOID lpEnvironment, // mutató egy új környezetblokkra
LPCTSTR lpCurrentDirectory, // mutató az aktuális könyvtár nevére
LPSTARTUPINFO lpStartupInfo, // mutató a STARTUPINFO struktúrához
LPPROCESS_INFORMATION lpProcessInformation // mutató a PROCESS_INFORMATION struktúrához
);
A CreateProcess funkció létrehoz egy új folyamatot és annak fő szálát. Az új folyamat végrehajtja a megadott végrehajtható fájlt. A CreateProcess funkció új program indítására szolgál. A WinExec és a LoadModule funkciók is működnek, de nem nyújtanak olyan szolgáltatásokat, mint a CreateProcess.
A folyamat létrehozása mellett a CreateProcess egy stream objektumot is létrehoz. A szálat egy inicializálási verem létrehozza, amelynek méretét a végrehajtható fájl képének fejlécében írja le. A szál megkezdi ezt a képet a belépési ponton.
Az új folyamat leírása és az új téma teljes hozzáférési jogosultsággal jön létre. Mindkét leíró esetén, ha a biztonsági leíró nincs megadva, akkor a leíró használható minden olyan függvényhez, amely ilyen típusú objektumleíró-t igényel. Biztonsági leíró esetén a hozzáférést ellenõrzi a fogantyú használatára vonatkozó minden kérelem. Ha az ellenőrzés nem garantálja a hozzáférést, akkor a kérés nem tudja használni a szál leírását.
A folyamat 32 bites folyamatazonosítót kap. Az azonosító a folyamat befejezéséig érvényes. Használható a folyamat felismerésére, vagy az OpenProcess függvény megadására a folyamatkezelő megnyitásához. A folyamatban lévő inicializáló szál 32 bites szálazonosítóval is rendelkezik. Ez az azonosító a szál befejezéséig rendelkezésre áll, és a rendszeren belüli áramlás egyedileg azonosítására használható. Ezeket az azonosító adatokat a PROCESS_INFORMATION struktúra visszaküldi.
Ha rámutat az alkalmazás nevére a vonalak vagy a lpCommandLine lpApplicationName, akkor nem számít, hogy a fájl kiterjesztését az alkalmazás nevét, egy kivétellel: az alkalmazás az MS-DOS vagy Windows platformon, amelynek kiterjesztésű fájlokat .COM kell beépíteni .COM.
A hívó szál a WaitForInputIdle függvénnyel várhatja, hogy az új folyamat inicializálása befejezze és felfüggeszti a felhasználót az adatok beviteléhez anélkül, hogy megfelelően feldolgozta volna. Ezt a szülõ és a gyermek folyamatok szinkronizálásakor lehet használni, mert a CreateProcess visszaküldésre vár, anélkül, hogy várni kellene az új folyamat inicializálására. Például a hívási folyamatnak meg kell hívnia a WaitForInputIdle-et, mielőtt megpróbálja megtalálni az új folyamathoz kapcsolódó ablakot.
Az előnyös módon a folyamat befejezése, hogy használja a ExitProcess funkciót, mert ez a funkció megakadályozza az összes dinamikusan összekapcsolt könyvtár (DLL), a folyamatban használt a befejezése annak jön. Az egyéb befejező eszközök nem értesítették a hozzá csatolt könyvtárakat. Megjegyezzük, hogy a hívási folyamat ExitProcess, egyéb eljárási áramok befejezése nélkül képes végrehajtani további kódot (végső kódfolyamból beleértve adjoint könyvtárak).
Az alábbi példában futtatjuk és azonnal megöljük a notepad.exe folyamatot
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
if (CreateProcess ( "C: \\ Windows \\ notepad.exe", NULL, NULL, NULL, HAMIS, NULL, NULL, NULL, CIF, pi) == TRUE)
cout <<"process" <
TerminateProcess (pi.hProcess, NO_ERROR); // távolítsa el a folyamatot
>
>
A TerminateProcess funkció befejezi a megadott folyamatot és annak összes szálát.
BOOL TerminateProcess (
HANDLE hProcess, // process handle
UINT uExitCode // exit kilépési kód
);