Должен ли я закрыть унаследованный дескриптор, который позже будет принадлежать дочернему процессу?

Microsoft здесь перестраховалась. в своей статье «Создание дочернего процесса с перенаправленным вводом и выводом» они говорят:

Остальные открытые дескрипторы очищаются, когда этот процесс завершается.
Чтобы избежать утечки ресурсов в более крупном приложении, закрывайте дескрипторы явно.

Что совершенно бесполезно. Какие ручки? В каком процессе?


Я хочу разобраться в этом.

Когда дескриптор создается в родительском процессе с SECURITY_ATTRIBUTES.bInheritHandle = TRUE , дочерний процесс может его видеть и использовать, и дескриптор имеет одинаковое значение и права доступа в обоих процессах.

Но это один и тот же дескриптор или это копия, которая имеет одинаковое числовое представление?

Если я передаю дескриптор hRead дочернему процессу, чтобы он мог читать из канала, и дочерний процесс закрывает дескриптор, мне также нужно закрыть его из родительского процесса ? Не удалит ли конвейер из-под дочернего процесса?

Мои эксперименты показывают, что CloseHandle возвращает успех при попытке закрыть дескриптор hRead , переданный дочернему процессу после ребенок закрыл его. Это убедительно доказывает, что да, вам следует закрыть его. Однако я был бы признателен за более веский совет здесь.

8
задан Jonathan Leffler 9 February 2014 в 23:05
поделиться