确定一个进程是否死了 – 通过PID

我有两种不同的方法来检查一个进程是否还在运行:

1)使用GetExitCodeProcess()2)使用CreateToolhelp32Snapshot()遍历进程列表并检查PID

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

有没有一种方法可以肯定地知道一个过程是否还活着或者没有通过PID? 谢谢!

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

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

不要使用这样的PID。 PID被重用并且具有非常窄的范围,具有非常高的碰撞概率。 换句话说,你会发现一个正在运行的过程,但将是一个不同的过程。

你不能假定一个低层次的API调用的功能就像它的名字或者高级描述一样。 内核仍然有一些事情要做,而且通常调用只是对内核的请求,内核需要做很多事情(取决于实现),然后才会真正释放PID。 在这种情况下,在您发出呼叫之后,您可能会认为该进程已经死亡,但是内核仍然需要清理。

来自MSDN:

TerminateProcess函数用于无条件地导致进程退出。 如果使用TerminateProcess而不是ExitProcess,动态链接库(DLL)维护的全局数据的状态可能会受到影响。

TerminateProcess立即启动终止并返回。 这会停止进程内所有线程的执行,并请求取消所有未决的I / O。 被终止的进程不能退出,直到所有待处理的I / O完成或取消。

一个进程不能阻止自己被终止。

你可以使用Process Status API吗? 有枚举系统上所有正在运行的进程的函数 – 这可以帮助你。