当用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参数创建子进程将继承对象的句柄。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top