选择该手柄是由子进程继承
-
23-09-2019 - |
题
当用C创建子进程++使用Windows API,可以允许手柄从继承父到子。在微软例子“创建具有重定向输入和子进程输出“时,重定向子进程的STD /缩小到由父创建管,有必要允许继承用于重定向管道是可用的。
我在一个小的演示类的工作是启动外部可执行文件,读取输出,然后吐回给调用者(谁返回的输出记录到文件中)。我试图建立一个超时功能,它只会呼吁孩子TerminateProcess()
并继续与生活之前阻止了一定的时间。
不过,我发现,通过允许处理继承,子进程还具有手柄(带的进程浏览器)输出到输出文件中。我不希望子进程来获得这个句柄,但在这种情况下,(此演示类)父不知道手柄的两侧,所以我目前还不能使用SetHandleInformation()
来取消标记输出文件专门从继承排除。
我敢肯定,必须有继承一个更好的办法的只有的具体把手,我想,没有让“一刀切”基业通过无意识且不需要手柄。不幸的是,我一直无法找到一个解决方案,具有浏览尽可能多的相关MSDN文章,我都能找到,而且已经用谷歌搜索自己变成沮丧的状态。
目前最起码,我需要做的的东西的从子去除手柄,而不必演示类中的句柄(它们是由调用的类使用,并且这个演示类有它们的存在没有显式知识)。
任何更多的选择性继承溶液?我特别感兴趣的是让我特别声明一下手柄继承的解决方案,以及所有未指定的句柄不会被继承,如果这样的一个解决方案。
感谢您麻烦。
解决方案
如果输出文件句柄由子进程继承的,然后,这是因为在父进程的代码的打开文件中明确指出,文件句柄应该是继承。它通过一个值的lpSecurityAttributes
参数 CreateFile
。默认状态是把手的不的是遗传的。
在我看来,你的过程,创建类不应该试图第二猜测它的调用者,谁已经打开的文件。
不过,如果你有确切它处理新工艺需要专门的知识,那么作为Windows Vista中的,没有用于指定一个机制,手柄应被继承。当您准备呼叫CreateProcess
,使用而不是通常的STARTUPINFOEX
一个STARTUPINFO
结构。它有一个lpAttributeList
成员。分配和初始化,然后使用 UpdateProcThreadAttribute
与 PROC_THREAD_ATTRIBUTE_HANDLE_LIST
设置手柄的名单被继承。所有手柄需要被继承,你仍然需要当你调用bInheritHandles = true
指定CreateProcess
。您还需要包括在EXTENDED_STARTUPINFO_PRESENT
参数dwCreationFlags
。 雷蒙德陈表现出了制品中的技术在2011年
如果这增加的功能是不提供给你,那么你当然可以尝试[枚举所有程序的打开的句柄]与的 SetHandleInformation
,但似乎超出他们的工作是创建子进程的函数的范围。让创建手柄代码担心是否应该继承。
其他提示
您可以使用 SetHandleInformation 以明确输出上有把手的HANDLE_FLAG_INHERIT
位,这将阻止继承它的子进程。
如果该标志被设置,以CreateProcess的组为TRUE bInheritHandles参数创建子进程将继承对象的句柄。