是否可以保证 Windows 上的进程 ID 在一定时间内不会被重复使用

是否可以保证 Windows 上的进程 ID 在一定时间内不会被重复使用

我有一个脚本,它会生成多个进程,然后通过它们的进程 ID 跟踪它们,我不希望一个进程关闭,然后另一个进程在我检查的时间内获取该进程 ID。有什么保证吗?到目前为止,我发现没有人真正知道它们何时被重复使用,不管是随机的还是非随机的。

答案1

进程 ID 是与进程对象关联的值,只要进程对象仍然存在,其进程 ID 也将继续存在。只要进程仍在运行(进程隐式保留对自身的引用),或者只要有人仍拥有进程对象的句柄,进程对象就会一直存在。

如果你仔细想想,这很有道理,因为只要还有进程的句柄,有人就可以调用 WaitForSingleObject 等待进程退出,或者可以调用 GetExitCodeProcess 来检索退出代码,并且该退出代码必须存储在某个地方以供稍后检索。

当所有句柄都关闭时,内核就知道没有人会询问进程是否仍在运行或它的退出代码是什么(因为您需要一个句柄来询问这些问题)。此时可以销毁进程对象,从而销毁进程 ID。

如果有人在僵尸进程上调用 OpenProcess,会发生什么情况?这与他们在正在运行的进程上调用它时发生的情况相同:他们获取了该进程的句柄。为什么您要获取僵尸进程的句柄?好吧,您可能还不知道它是一个僵尸进程;您获取句柄是为了调用 WaitForSingleObject 来查看它是否已退出。或者您可能在知道它是一个僵尸进程的情况下获取了句柄,因为您想调用 GetExitCodeProcess 来查看退出代码是什么。

相关内容