2

我试图找出我继承的一些 Win32 管道代码中的问题。这是 x2 的旧备用CreatePipe()后跟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 文档,这意味着源句柄将在复制后关闭。

将句柄(到管道)的副本复制到同一进程中,然后关闭原始句柄究竟有什么意义?为什么不直接使用原版?

4

1 回答 1

4

好吧,在我看来,关键在于TRUE参数。那就是BOOL bInheritHandle, 所以这段代码所做的是复制句柄以使其可继承。

通常,这可以通过在创建句柄时设置为security.bInheritHandle来轻松完成。TRUE但在这种情况下,这将使两个句柄都可以继承。而且很明显,原作者只想继承child_stdout_write.

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

SetHandleInformation(handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
于 2012-06-29T21:45:18.373 回答