Odpovídáte na názor ke článku Temná strana linuxu - spouštění procesů.
"To vůbec nehledejte u Windows, kde se popisovače ... HANDLE... sdílí a to takovým způsobem, že když rodič popisovač zavře, automaticky se zavře v dítěti a další operace s ním vedou na chybu "neplatný popisovač! Druhým rozdílem je, že když v Linuxu skončí dítě, zavřou se všechny jeho popisovače a roury spadnou do stavu SIGPIPE. Ve Windows zůstanou handly otevřené a čteni z rour bude viset v deadlocku!)"
Tomu, že když rodič zruší nějaké handle předané do dítěte, že se tato operace provede i v dítěti, moc nevěřím, ale nezkoušel jsem to. Ale ne že by rodič to handle v dítěti zrušit nemohl (Windows má na práci s handle "krásnou" funkci DuplicateHandle).
Jinak si u každého handle můžete nastavit, zda bude při vytváření dítěte kopírováno i do nového procesu či nikoliv (SetHandleInformation). CreateProcess má dokonce parametr, kde uvádíte, zda chcete dědit všechna handle či nikoliv.
Ve Windows je filozofie taková, že handle je něco na způsob nepřímého odkazu na daný objekt. Jádro si pamatuje počty existujících handle pro jednotlivé objekty. Když někdo zavře poslední handle nějaké entity, tento objekt je odstraněn z paměti (není to úplně přesně tak, ale dostatečně přesně).
To mimo jiné znamená, že pokud vytvoříte rouru (CreatePipe) a jeden její konec předáte dítěti a ono po nějakých výpočtech skončí, pořád máte v ruce svůj konec té roury a můžete jej používat. Pokud se z ní pokusíte číst, může to vést k zablokování, protože není pravděpodobné, že by si někdo jiný k té rouře otevřel handle a nějaká data do ní zapsal.
Mimochodem i Windows mají možnost provádět fork (na Windows XP jsem to zkoušel), ale musíte k tomu využít nedokumentovanou funkci NtCreateProcess (NtCreateProcessEx). Úspěsné spuštění procesu přes tuto funkci však vyžaduje hodně volání dalších méně známých rutin. Navíc konkrétní postup je závislý na verzi operačního systému a také na tom, zda daný proces používá GUI, takže si myslím, že krom pokusů jej asi nikdo nevyužije (vynecháme-li implementaci POSIX věcí pod Windows).
Co se týče čekání na ukončení procesu přes WaitForSingleObject: tahle vlastnost se mi velmi líbí. Dá se tak čekat i na ukončení vláken či dokončení operace nad souborem. Můžete také čekat na více objektů najednou (objektů různých druhů) a nechat se probudit, když jeden (či všechny) přejde do signálního stavu.
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 51 064×
Přečteno 23 939×
Přečteno 22 871×
Přečteno 20 953×
Přečteno 17 760×