我正在尝试追踪我继承的一些Win32管道代码中的问题。这是CreatePipe()
x2的old standby,后跟DuplicateHandle()
x2和CreateProcess()
。
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文档,这意味着源句柄将在复制后关闭。
将句柄(到管道)的副本复制到同一个进程,然后关闭原始文件到底是什么意思?为什么不使用原始版本?
答案 0 :(得分:4)
嗯,我认为密钥在TRUE
参数中。这是BOOL bInheritHandle
,所以这段代码的作用是复制句柄以使其可继承。
通常,在创建句柄时将security.bInheritHandle
设置为TRUE
可以轻松完成此操作。但在这种情况下会使两个处理都可继承。显然,原作者只想继承child_stdout_write
。
请注意,使用较少的代码可以实现相同的效果:
SetHandleInformation(handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);