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.
Ah. Tak więc uchwyt * jest * klonowany, gdy spawnuję proces potomny. Tego właśnie szukałem. – GSerg