Winapi 什么';s重复句柄的点';s重复\u关闭\u句柄标志?

Winapi 什么';s重复句柄的点';s重复\u关闭\u句柄标志?,winapi,pipe,Winapi,Pipe,我正试图找出我继承的一些Win32管道代码中的一个问题。这是CreatePipe()x2的开头,后面是DuplicateHandle()x2和CreateProcess() 让我困惑的是DUPLICATE\u CLOSE\u SOURCE调用中使用的标志DUPLICATE\u CLOSE\u SOURCE。根据Microsoft文档,这意味着复制后将关闭源句柄 将句柄的副本(到管道)复制到同一流程中,然后关闭原始句柄,这到底有什么意义?为什么不直接使用原版?嗯,在我看来,键在TRUE参数中。这是

我正试图找出我继承的一些Win32管道代码中的一个问题。这是
CreatePipe()
x2的开头,后面是
DuplicateHandle()
x2和
CreateProcess()

让我困惑的是
DUPLICATE\u CLOSE\u SOURCE
调用中使用的标志
DUPLICATE\u CLOSE\u SOURCE
。根据Microsoft文档,这意味着复制后将关闭源句柄


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

嗯,在我看来,键在
TRUE
参数中。这是BOOL bInheritHandle,因此此代码所做的是复制句柄以使其可继承

通常,在创建句柄时,可以通过将
security.bInheritHandle
设置为
TRUE
轻松完成此操作。但在本例中,这将使两个句柄都可继承。很明显,原作者只想继承
子对象

请注意,使用较少参与的代码也可以达到相同的效果:

SetHandleInformation(handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);

在我看来,关键是
TRUE
参数。这是BOOL bInheritHandle
,因此此代码所做的是复制句柄以使其可继承

通常,在创建句柄时,可以通过将
security.bInheritHandle
设置为
TRUE
轻松完成此操作。但在本例中,这将使两个句柄都可继承。很明显,原作者只想继承
子对象

请注意,使用较少参与的代码也可以达到相同的效果:

SetHandleInformation(handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);

它将管道的写入句柄复制到子进程中。我假设父进程不需要保留写句柄,这样就可以让DuplicateHandle()关闭它。我去澄清一下,这很奇怪。也许代码对父级写入和子级写入句柄做了一些奇怪的处理。我不能根据给出的小片段进行猜测。这有点离题,但DUPLICATE_CLOSE_SOURCE标志是在远程进程中关闭句柄的唯一方法之一。它将管道的写入句柄复制到子进程中。我假设父进程不需要保留写句柄,这样就可以让DuplicateHandle()关闭它。我去澄清一下,这很奇怪。也许代码对父级写入和子级写入句柄做了一些奇怪的处理。我真的无法根据给出的小片段进行猜测。这有点离题,但DUPLICATE_CLOSE_SOURCE标志是在远程进程中关闭句柄的唯一方法之一。啊。我打赌就是这个。至少,我认为这可能是他想要做的。他确实设置了
security.bInheritHandle=true。但是,后来有一些代码(他已经注释掉了,可能是因为他没有使用正确的句柄)在其中关闭了几个句柄上的
HANDLE\u标志\u INHERIT
位。所以他可能只想让客户端的两个句柄可继承,但他最终编写了大量额外的代码(并在过程中混淆了句柄)。是的,重定向std{in,out}是一团乱。2个管道乘以每个管道2个句柄乘以2个进程,等于同时考虑8个句柄!。。。由于代码被注释掉了,它还继承了几个额外的句柄,这就是bug的来源,让我首先看到了这一点。耶!接受这个,因为它回答了我的问题和我的元问题:-)。现在来清理这个代码…啊。我打赌就是这个。至少,我认为这可能是他想要做的。他确实设置了
security.bInheritHandle=true。但是,后来有一些代码(他已经注释掉了,可能是因为他没有使用正确的句柄)在其中关闭了几个句柄上的
HANDLE\u标志\u INHERIT
位。所以他可能只想让客户端的两个句柄可继承,但他最终编写了大量额外的代码(并在过程中混淆了句柄)。是的,重定向std{in,out}是一团乱。2个管道乘以每个管道2个句柄乘以2个进程,等于同时考虑8个句柄!。。。由于代码被注释掉了,它还继承了几个额外的句柄,这就是bug的来源,让我首先看到了这一点。耶!接受这个,因为它回答了我的问题和我的元问题:-)。现在要清除此代码。。。