我是否必须关闭以后由子进程拥有的继承句柄?

GSe*_*erg 8 winapi handle interprocess child-process

微软在这里玩得很安全 在他们的文章"创建具有重定向输入和输出的子进程"中,他们说:

此过程终止时,将清除剩余的打开句柄.
为避免较大应用程序中的资源泄漏,请显式关闭句柄.

这完全没用.处理什么?在哪个过程中?


我想绕过它.

在父进程中创建句柄时SECURITY_ATTRIBUTES.bInheritHandle = TRUE,子进程可以查看和使用它,并且句柄在两个进程中具有相同的值和访问权限.

但它是相同的句柄,还是碰巧具有相同数字表示的副本?

如果我将hRead句柄传递给子进程以便它可以从管道中读取,并且子进程关闭句柄,是否还需要从父进程关闭它?它不会从子进程下擦除管道吗?

我的实验表明,在孩子关闭后,CloseHandle尝试关闭hRead传递给孩子的句柄时返回成功.这强烈支持是的,你应该关闭它.但是,我希望在这里提出更可靠的建议.

Chr*_*cke 11

你在那里击中了钉子.Win32句柄充当对底层内核模式对象的用户模式引用.通常通过某种CreateXXX调用创建新对象和现有对象的句柄(引用) - 通过调用DuplicateHandle可以在当前或其他进程中创建其他引用- {或将句柄标记为可继承并创建新进程 -将当前进程的句柄复制到子进程中 - 确保句柄值相同.}

此时,(至少)有两个对内核对象的引用,这两个引用都需要关闭以解锁对象并释放任何消耗的资源.