选择子进程继承的句柄

Kev*_*enK 6 c++ windows handle parent-child

使用Windows API在C++中创建子进程时,可以允许从父对象继承句柄.在Microsoft示例"使用重定向输入和输出创建子进程"中,将子进程'std in/out重定向到父进程创建的管道,必须允许继承以使重定向管道可用.

我正在开发一个小型演示类,它启动一个外部可执行文件,读取输出,然后将其吐回调用者(将返回的输出记录到文件中).我正在尝试建立一个超时功能,它只会在呼唤TerminateProcess()孩子并继续生活之前阻止一段时间.

但是,我发现通过允许句柄继承,子进程还有一个句柄(使用Process Explorer可见)到输出文件.我不希望子进程获得这个句柄,但是在这种情况下父进程(这个演示类)也不知道句柄,因此我目前无法SetHandleInformation()专门取消标记输出文件以将其从继承中排除.

我敢肯定,必须有一个更好的方式来继承ONLY,我想具体的把手,而不让"一刀切"基业通过无意识且不需要手柄.不幸的是,我一直无法找到解决方案,浏览了尽可能多的相关MSDN文章,并且将Google自己置于沮丧状态.

至少,我需要做一些事情来移除子句中的句柄,而不必在演示类中使用这些句柄(它们由调用类使用,并且此演示类没有明确知道它们的存在).

任何更具选择性继承的解决方案?我特别感兴趣的是允许我明确声明要继承的句柄的解决方案,如果存在这样的解决方案,则不会继承所有未指定的句柄.

非常感谢你.

Rob*_*edy 4

如果输出文件句柄被子进程继承,那么这是因为打开文件的父进程中的代码明确声明文件句柄应该是可继承的。lpSecurityAttributes它传递了参数 的值CreateFile。默认状态是句柄不可继承

在我看来,您的进程创建类不应该尝试事后猜测已经打开文件的调用者。

但是,如果您对哪个处理新进程的需求有专门的了解,那么从 Windows Vista 开始,就有一种机制可以指定应继承哪些句柄。当您准备调用时CreateProcess,请使用STARTUPINFOEX结构而不是通常的结构STARTUPINFO。它有一个lpAttributeList成员。分配并初始化它,然后使用UpdateProcThreadAttributewithPROC_THREAD_ATTRIBUTE_HANDLE_LIST设置要继承的句柄列表。所有句柄都需要是可继承的,并且您仍然需要bInheritHandles = TRUE在调用时指定CreateProcess。您还需要包含EXTENDED_STARTUPINFO_PRESENTdwCreationFlags参数中。Raymond Chen 在 2011 年的一篇文章中演示了该技术。

如果您无法使用该添加的功能,那么您当然可以尝试枚举所有程序的打开句柄并使用 设置它们的所有继承属性SetHandleInformation,但这似乎超出了其工作是创建子进程的函数的范围。让创建句柄的代码担心它们是否应该可继承。