Я пытаюсь отследить проблему в некотором коде Win32, который я унаследовал. Это old standby от CreatePipe()
x2, за которым следует DuplicateHandle()
x2 и CreateProcess()
.Что такое флаг DUPLICATE_CLOSE_HANDLE DuplicateHandle?
if (!CreatePipe(&child_stdout_read, &parent_write, &security, 0) ||
!DuplicateHandle(GetCurrentProcess(), parent_write,
GetCurrentProcess(), &child_stdout_write, 0, TRUE,
DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)) {
throw std::system_error(GetLastError(), std::system_category());
}
Что имеет меня путать это флаг DUPLICATE_CLOSE_SOURCE
используется в DuplicateHandle()
вызовов. Согласно документам Microsoft это означает, что дескриптор источника будет закрыт после дублирования.
Что конкретно может сделать копирование ручки (в трубу) в тот же процесс, а затем закрытие оригинала? Почему бы просто не использовать оригинал?
Это дублируя ручку записи в трубы в дочернем процессе. Я предполагаю, что родитель не должен содержать дескриптор записи, поэтому он позволяет DuplicateHandle() закрывать его. – Luke
Но если вы посмотрите, в этом случае процесс «from» и «to» будут одинаковыми. Я объясню это. –
Ну, это странно. Возможно, код делает что-то странное с handle_write и child_stdout_write. Я не могу на самом деле опасаться угадывания, основанного на минимальном фрагменте. – Luke