如何等待被调用进程的克隆子进程退出?

时间:2010-03-11 10:58:03

标签: c++ windows

我有一个程序需要调用进程来执行操作并等待它完成操作。问题是被调用的进程克隆自己并退出,这导致等待api在进程退出时返回。我如何等待克隆进程完成执行并返回?

我正在使用http://www.microsoft.com/msj/0399/jobkernelobj/jobkernelobj.aspx中提到的Windows JOB对象,但我不确定这是否是最好的方法。

3 个答案:

答案 0 :(得分:1)

嗯,我很确定你可以从任何进程中获得spa生成器进程ID。我将遍历所有进程,找到一个人的父ID与你生成的进程匹配,然后等待它死掉。

或者(我的意思是,那非常黑客)儿童过程在做什么?是否有其他方法可以检测到它何时完成它的目的?

获取进程父ID的黑客方法

http://www.codeguru.com/cpp/w-p/win32/article.php/c1437

获取句柄,并使用上面代码中的方法返回父ID。

http://msdn.microsoft.com/en-us/library/ms684280(VS.85).aspx

OpenProcess获取一个id,获取一个句柄(如果你很幸运)

http://msdn.microsoft.com/en-us/library/ms684320(VS.85).aspx

GetProcessId获取句柄,获取它的id。

http://msdn.microsoft.com/en-us/library/ms683215(VS.85).aspx

GetExitCodeProcess接受句柄,返回进程是否完成。

http://msdn.microsoft.com/en-us/library/ms683189(VS.85).aspx

所以appart使用隐藏的nt调用它明确地告诉你不要,你基本上必须创建你的进程,得到它的id,然后垃圾邮件的所有进程,打开它们并检查他们的父id与进程的id你创建了,如果你没有找到,那么就完成了,如果你这样做了,用GetExitCodeProcess将其垃圾邮件直到它完成。

我没有测试任何这个,但它看起来像是一种方法。虽然如果这是最好的方式,我可能只需要放弃对窗户的所有信任......

答案 1 :(得分:0)

如果你可以控制被调用进程的来源,一种可能的解决方案就是让它等待它通过克隆自己产生的进程。

答案 2 :(得分:0)

+1使用作业对象;)

假设你正在运行的进程没有以这样的方式产生克隆版本的自身,那么它就会突然失去工作......

您应该能够简单地监控工作事件并对JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO采取行动(请参阅JOBOBJECT_ASSOCIATE_COMPLETION_PORTSetInformationJobObject())。以这种方式监视作业还将为您提供有关在作业中创建的新进程的processId的通知以及退出时的详细信息。