Анонимные Трубы - PullRequest
       28

Анонимные Трубы

3 голосов
/ 19 августа 2010

Я написал две короткие программы, которые используют анонимные каналы для общения. Родительский процесс разделяет дескрипторы канала, устанавливая стандартные дескрипторы ввода-вывода для дочернего элемента:

// -- Set STARTUPINFO for the spawned process -------------------------
ZeroMemory(&m_ChildSI, sizeof(STARTUPINFO));
GetStartupInfo(&m_ChildSI);

m_ChildSI.dwFlags       = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
m_ChildSI.wShowWindow   = SW_HIDE;
m_ChildSI.hStdError     = m_pipeChild.WritePipeHandle();
m_ChildSI.hStdOutput    = m_pipeChild.WritePipeHandle();
m_ChildSI.hStdInput     = m_pipeParent.ReadPipeHandle();

Ребенок получает дескриптор канала чтения с вызовом GetStdHandle :

hReadPipe = GetStdHandle(STD_INPUT_HANDLE)

Мой вопрос: Дескрипторы канала создаются родительским процессом, который вызывает CloseHandle () для них, как только родитель и потомок закончили связь.

Должен ли ребенок также вызывать CloseHandle ()? Я думал, что, поскольку это стандартные дескрипторы ввода-вывода, они будут автоматически освобождены при сворачивании процесса.

спасибо!

Ответы [ 3 ]

3 голосов
/ 19 августа 2010

В Win32 объекты ядра, такие как каналы, являются ссылками одного или нескольких дескрипторов пользовательского режима. Когда все дескрипторы закрыты, базовый объект может быть закрыт.

Дескрипторы в каждом процессе, хотя они могут иметь одно и то же значение и могут относиться к одному и тому же объекту, являются разными дескрипторами и должны закрываться отдельно.

1 голос
/ 19 августа 2010

Я только что прочитал в документе Наследование дескриптора трубы на MSDN, что:

"Когда дочерний процесс закончил с каналом, он должен закрыть дескриптор трубы, вызвав CloseHandle или завершив, которая автоматически закрывает ручку. "

0 голосов
/ 19 августа 2010

Любой дескриптор может быть оставлен незамеченным после завершения работы приложения, Windows автоматически освободит ресурсы. Но лучше закрывать их вручную, чтобы все было логично и логично. Если оставить ручки открытыми, это может привести к ошибкам и утечкам при повторном использовании или модернизации кода.

...