通过PID确定进程是否已经死亡

时间:2009-11-30 21:35:07

标签: c windows process

我有两种不同的方法可以检查进程是否仍在运行:

1)使用GetExitCodeProcess() 2)使用CreateToolhelp32Snapshot()并检查PID

来遍历进程列表

现在,在这两种情况下,我仍然得到一个我终止使用TerminateProcess的进程,直到它还没有。

有没有办法可以肯定地知道一个过程是否还活着还是死了? 谢谢!

4 个答案:

答案 0 :(得分:3)

不要将PID用于此类事情。 PID被重用并具有非常窄范围,具有非常高的冲突概率。换句话说,您将找到一个正在运行的流程,但将是不同的流程。

答案 1 :(得分:3)

GetExitCodeProcess的调用应为活动进程返回STILL_ACTIVE。在调用TerminateProcess之后,该过程将会死亡,并且将返回不同的值。

检查进程是否处于活动状态的另一种方法是WaitForSingleObject。如果在进程句柄上调用此超时为0,如果进程仍在运行,它将立即返回WAIT_TIMEOUT

答案 2 :(得分:0)

您不能假设低级API调用函数的外观或者您认为它应该如何从其名称或高级描述中起作用。内核仍然有事可做,而且通常调用只是对内核的请求,并且在实际释放PID之前,内核需要做很多事情(取决于实现)。在这种情况下,在您发出调用后,您可能认为该过程已经死亡,但是内核仍然需要清理。

From MSDN :

  

使用TerminateProcess功能   无条件地导致进程   出口。全球数据的状态   由动态链接库维护   (DLL)可能会受到损害   使用TerminateProcess而不是   了ExitProcess。

     

TerminateProcess启动终止   并立即返回。这停止了   执行内部的所有线程   处理和请求取消   所有待处理的I / O.终止了   进程无法退出,直到所有挂起   I / O已完成或取消。

     

一个过程无法阻止自己   被终止。

答案 3 :(得分:0)

你可以使用Process Status API吗? <{3}}系统上有所有正在运行的进程的功能 - 这可以帮助您。