Microsoft здесь перестраховалась. в своей статье «Создание дочернего процесса с перенаправленным вводом и выводом» они говорят:
Остальные открытые дескрипторы очищаются, когда этот процесс завершается.
Чтобы избежать утечки ресурсов в более крупном приложении, закрывайте дескрипторы явно.
Что совершенно бесполезно. Какие ручки? В каком процессе?
Я хочу разобраться в этом.
Когда дескриптор создается в родительском процессе с SECURITY_ATTRIBUTES.bInheritHandle = TRUE
, дочерний процесс может его видеть и использовать, и дескриптор имеет одинаковое значение и права доступа в обоих процессах.
Но это один и тот же дескриптор или это копия, которая имеет одинаковое числовое представление?
Если я передаю дескриптор hRead
дочернему процессу, чтобы он мог читать из канала, и дочерний процесс закрывает дескриптор, мне также нужно закрыть его из родительского процесса ? Не удалит ли конвейер из-под дочернего процесса?
Мои эксперименты показывают, что CloseHandle
возвращает успех при попытке закрыть дескриптор hRead
, переданный дочернему процессу после ребенок закрыл его. Это убедительно доказывает, что да, вам следует закрыть его. Однако я был бы признателен за более веский совет здесь.