翻译《The Old New Thing》- When does a process ID become available for reuse?

When does a process ID become available for reuse? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20110107-00/?p=11803

Raymond Chen 2011年01月07日


进程 ID 何时可以被复用?

一位客户想要了解有关进程 ID 的一些信息:

我正在编写一些依赖于进程 ID 的代码,我想更好地理解进程 ID 复用的问题。

进程 ID 何时可以被 复用?是在进程句柄变为已信号状态时(但在僵尸对象从系统中移除之前),还是只有在最后一个进程句柄被释放后(进程对象从系统中移除)才会发生?

如果是前者,OpenProcess() 对僵尸进程会成功吗?(即已经终止但尚未从系统中移除的那个)

进程 ID 是与进程对象关联的一个值,只要进程对象还在,它的进程 ID 也会在。进程对象会一直存在,只要进程仍在运行(进程隐式地保留了对自己的引用)或者只要有人仍然拥有进程对象的句柄。

仔细想想,这是有道理的,因为只要还有进程的句柄,就可以调用 WaitForSingleObject 等待进程退出,或者调用 GetExitCodeProcess 检索退出代码,而且退出代码必须存储在某个地方以便以后检索。

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

如果有人对一个僵尸进程调用 OpenProcess 会发生什么?和对一个正在运行的进程调用是一样的:他们得到了进程的句柄。你为什么要得到一个僵尸进程的句柄呢?嗯,你可能还不知道它是僵尸;你获取句柄是为了调用 WaitForSingleObject 看看它是否已经退出。或者你明知它是僵尸,却还是获取了句柄,因为你想要调用 GetExitCodeProcess 来查看退出代码是什么。

相关推荐
汉克老师2 分钟前
GESP2026年9月认证C++七级( 第一部分选择题(8~15题)精讲
c++·gesp·小学生·学c++编程
Mr_Macallon4 分钟前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
ITHAOGE1511 分钟前
下载 | Win11 26H2 正式版发布!(ISO映像、2026年度版本、26300.9457、Windows 11)
windows·科技·微软·电脑
如意猴43 分钟前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
朝朝辞暮i1 小时前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法
汉克老师1 小时前
GESP2026年9月认证C++一级( 第三部分编程题(1、新龟兔赛跑))精讲
c++·gesp·小学生·学c++编程
沫璃染墨1 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
YCOSA20251 小时前
雨晨 Windows 11 IoT 企业版 Edge 轻装 VCDX 29680.1000
windows·物联网
wuminyu1 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
知识分享小能手2 小时前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习