Windows 关闭CreateProcess生成的子进程

Windows 关闭CreateProcess生成的子进程,windows,winapi,process,subprocess,createprocess,Windows,Winapi,Process,Subprocess,Createprocess,我正在使用CreateProcess运行我的进程/应用程序。 其目的是运行它,做一些事情,等待一些指示,然后关闭它(使用TerminateProcess) 我注意到这个应用程序/流程创建了子流程。 此外,当终止创建的进程时,子进程不会终止,并且仍会保留一段时间 我想问的是,是否有一种方法可以用主进程以某种方式杀死所有的子进程。 它会导致问题,因为当我再次创建CreateProcess时,以前的流程会有一些遗留问题,我认为它们会导致一些问题 我真的很感谢你的帮助 使用Windows。工作就像过程组

我正在使用CreateProcess运行我的进程/应用程序。 其目的是运行它,做一些事情,等待一些指示,然后关闭它(使用TerminateProcess)

我注意到这个应用程序/流程创建了子流程。 此外,当终止创建的进程时,子进程不会终止,并且仍会保留一段时间

我想问的是,是否有一种方法可以用主进程以某种方式杀死所有的子进程。 它会导致问题,因为当我再次创建CreateProcess时,以前的流程会有一些遗留问题,我认为它们会导致一些问题


我真的很感谢你的帮助

使用Windows。工作就像过程组;一旦作业主管(您的初始进程)终止,操作系统将负责终止作业中的所有进程。这甚至可以在进程领导崩溃时使用。

使用Windows。工作就像过程组;一旦作业主管(您的初始进程)终止,操作系统将负责终止作业中的所有进程。这甚至可以在进程领导崩溃时使用。

当您使用CreateProcess创建进程时,您将获得一个LPPROCESS\u信息-指针。 它包含进程句柄。您需要手动关闭进程,因为Linux/Unix中没有进程层次结构


有关CreateProcess和进程信息,请参阅。使用CreateProcess创建进程时,将获得一个进程信息指针。 它包含进程句柄。您需要手动关闭进程,因为Linux/Unix中没有进程层次结构


有关CreateProcess和流程信息-结构,请参阅。

流程信息
不会告诉您有关子流程的信息。您必须枚举正在运行的进程,查找那些拥有
进程\u信息的进程。dwProcessID
作为其所有者PID,甚至可能是递归的,这样您就可以处理多层子进程。Remy,我如何运行所有进程并查找匹配的进程?还有,你认为这是一个耗时的手术吗?如果是这样,我将不得不跳过它。现在,我知道进程的名称(它们不太可能改变),并使用
taskill
强制它们死亡。这是一个非常粗糙的解决方案,但目前它仍然有效。我希望有一些不太黑的…@RemyLebeau Windows没有类似进程树的东西(像操作系统一样与Unix联机),在这种情况下,您无法清楚地确定哪个进程产生了哪个进程。@bash.d:这是完全错误的,您可以轻松地在Windows中构建进程树,因为您可以从使用创建的快照中获取任何给定进程ID的父进程ID。@FrerichRaabe您可能可以创建自己的进程树,但Windows本身不包含进程树<代码>流程\信息不会告诉您有关子流程的信息。您必须枚举正在运行的进程,查找那些拥有
进程\u信息的进程。dwProcessID
作为其所有者PID,甚至可能是递归的,这样您就可以处理多层子进程。Remy,我如何运行所有进程并查找匹配的进程?还有,你认为这是一个耗时的手术吗?如果是这样,我将不得不跳过它。现在,我知道进程的名称(它们不太可能改变),并使用
taskill
强制它们死亡。这是一个非常粗糙的解决方案,但目前它仍然有效。我希望有一些不太黑的…@RemyLebeau Windows没有类似进程树的东西(像操作系统一样与Unix联机),在这种情况下,您无法清楚地确定哪个进程产生了哪个进程。@bash.d:这是完全错误的,您可以轻松地在Windows中构建进程树,因为您可以从使用创建的快照中获取任何给定进程ID的父进程ID。@FrerichRaabe您可能可以创建自己的进程树,但Windows本身不包含进程树!我在几篇文章中读到过这方面的内容,问题是我无法访问这些进程,也无法向它们注入代码。因此,我无法将创建的子进程添加到作业对象中,并将其作为一个整体关闭:(@fashasha:MSDN页面我链接了说明:
在进程与作业关联后,默认情况下,它使用CreateProcess创建的任何子进程也与作业关联。[..]通过设置作业的扩展限制作业\u对象\u限制\u分离\u确定或作业\u对象\u限制\u静默\u分离\u确定,可以更改此默认行为。
。这意味着,除非作为作业创建者的您明确允许,否则子进程将自动成为作业的一部分。我在几篇文章中读到过这一点,问题是我不知道“我无法访问这些进程,也无法向它们注入代码。因此,我无法将创建的子进程添加到作业对象中,并将其作为一个整体关闭:(@fashasha:MSDN页面I linked解释:
在进程与作业关联后,默认情况下,它使用CreateProcess创建的所有子进程也与作业关联。[..]通过设置作业的扩展限制作业\u对象\u限制\u分离\u确定或作业\u对象\u限制\u静默\u分离\u确定,可以更改此默认行为。
。这意味着,除非您作为作业创建者明确允许,否则子进程将自动成为作业的一部分。