关于psutil.Process.children()处理PID复用的代码逻辑疑问
解析psutil中Process.children()的PID复用判断逻辑
先看你提到的这段代码:
# if child happens to be older than its parent # (self) it means child's PID has been reused intime = self.create_time() <= child.create_time() if intime: ret.append(child) stack.append(child_pid)
这段代码的核心目的是排除被系统复用的PID,避免把无关进程误判为当前进程的子进程,逻辑拆解如下:
- 正常情况下,父进程(
self)的创建时间必然早于它的子进程——毕竟得先启动父进程,才能fork出子进程。所以真正的子进程,它的create_time()肯定大于等于父进程的创建时间,此时intime为True,会被加入子进程列表。 - 如果某个进程的PID被系统标记为当前进程的"子进程",但它的
create_time()比父进程还早(也就是注释里说的"child happens to be older than its parent"),说明这个PID是被复用的:原来的子进程已经终止,系统把这个PID分配给了一个更早启动的进程,它显然不是当前进程的真正子进程,所以会被这段代码过滤掉(intime为False,不会加入列表)。
你之前的疑惑是搞反了判断逻辑:代码里的intime是在筛选"符合正常父子进程时间顺序"的进程,而注释里的异常情况(PID复用)是被排除的对象。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

