DuplicateHandle的DUPLICATE_CLOSE_HANDLE标志有什么意义?

时间:2012-06-29 20:41:05

标签: winapi pipe

我正在尝试追踪我继承的一些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文档,这意味着源句柄将在复制后关闭。

将句柄(到管道)的副本复制到同一个进程,然后关闭原始文件到底是什么意思?为什么不使用原始版本?

1 个答案:

答案 0 :(得分:4)

嗯,我认为密钥在TRUE参数中。这是BOOL bInheritHandle,所以这段代码的作用是复制句柄以使其可继承。

通常,在创建句柄时将security.bInheritHandle设置为TRUE可以轻松完成此操作。但在这种情况下会使两个处理都可继承。显然,原作者只想继承child_stdout_write

请注意,使用较少的代码可以实现相同的效果:

SetHandleInformation(handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);