2011-07-05 17 views
7

Microsoft gra tutaj bezpiecznie. W ich artykule, "Creating a Child Process with Redirected Input and Output", mówią:Czy muszę zamknąć odziedziczoną klamkę należącą później do procesu potomnego?

Pozostałe otwarte uchwyty są czyszczone po zakończeniu tego procesu.
Aby uniknąć przecieku zasobów w większej aplikacji, należy zamknąć jawnie uchwyty.

Co jest całkowicie bezużyteczne. Co obsługuje? W którym procesie?


Chcę się z tym pogodzić.

Po utworzeniu uchwytu w procesie nadrzędnym z SECURITY_ATTRIBUTES.bInheritHandle = TRUE proces potomny może je zobaczyć i używać, a uchwyt ma taką samą wartość i prawa dostępu w obu procesach.

Ale czy jest to ten sam uchwyt, czy jest to kopia, która ma tę samą reprezentację numeryczną?

Jeśli mijam hRead uchwyt do procesu potomnego tak, że można go odczytać z potoku, a proces dziecko zamyka uchwyt, mogę również trzeba zamknąć go z procesu nadrzędnego? Czy nie wykończy rurki spod procesu potomnego?

Moje eksperymenty pokazują, że CloseHandle zwraca sukces, gdy próbuje zamknąć uchwyt hRead przekazany dziecku po zamknięciu go przez dziecko. To zdecydowanie przemawia za tak, powinieneś to zamknąć. Byłbym jednak wdzięczny za bardziej solidną radę tutaj.

Odpowiedz

10

Uderzyłeś paznokciem w głowę. Struktury Win32 działają jako odniesienia trybu użytkownika do bazowego obiektu trybu jądra. Uchwyty (odniesienia) do nowych i istniejących obiektów są zwykle tworzone za pomocą jakiegoś wywołania CreateXXX - dodatkowe odwołania mogą być tworzone w bieżącym lub innych procesach, wywołując DuplicateHandle - {lub oznaczając uchwyt jako dziedziczny i tworząc nowy proces - który duplikuje uchwyt z bieżącego procesu do procesu potomnego - upewniając się, że wartość uchwytu jest identyczna.}

W tym miejscu znajdują się (przynajmniej) dwa odniesienia do obiektu jądra, z których oba muszą być zamknięte do odblokuj obiekt i uwolnij wszelkie zużyte zasoby.

+0

Ah. Tak więc uchwyt * jest * klonowany, gdy spawnuję proces potomny. Tego właśnie szukałem. – GSerg

Powiązane problemy