我有两种不同的方法来检查一个进程是否还在运行:
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吗? 有枚举系统上所有正在运行的进程的函数 – 这可以帮助你。