如何获取指定进程的所有祖先进程PID?
获取指定进程的所有祖先进程PID方案
在Linux系统中,并没有标准的get_parent_of()系统调用可以直接获取任意进程的父PID,要实现这个需求,最可靠的方式是读取**/proc文件系统**——这是Linux内核暴露进程信息的虚拟文件系统,每个进程都对应/proc/[PID]目录,其中的stat文件包含了该进程的父PID信息。
实现自定义的get_parent_of()函数
我们可以通过解析/proc/[PID]/stat文件来提取目标进程的父PID,该文件的第4个字段就是父进程ID(PPID)。以下是具体的实现代码:
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> pid_t get_parent_of(pid_t target_pid) { char proc_path[64]; snprintf(proc_path, sizeof(proc_path), "/proc/%d/stat", target_pid); FILE *fp = fopen(proc_path, "r"); if (fp == NULL) { // 进程不存在或无权限访问时返回0(根进程的父PID为0) return 0; } // stat文件格式:pid (comm) state ppid ... // 跳过进程名(可能包含空格,用%*s跳过),直接读取第4个字段的PPID pid_t ppid; fscanf(fp, "%*d %*s %*c %d", &ppid); fclose(fp); return ppid; } int main(void) { pid_t pid = getpid(); pid_t ppid = getppid(); while (ppid != 0) { printf("Process ID: %d, Parent process ID: %d\n", pid, ppid); pid = ppid; ppid = get_parent_of(pid); } // 打印根进程(PID为1,父PID为0) printf("Process ID: %d, Parent process ID: %d\n", pid, ppid); return 0; }
代码说明
- /proc文件读取逻辑:
get_parent_of()函数先构造目标进程的stat文件路径,打开后通过fscanf跳过前3个字段(PID、进程名、进程状态),直接读取第4个字段的PPID。 - 异常处理:如果目标进程不存在或无权限读取
/proc文件,函数返回0,终止循环。 - 循环终止条件:当PPID为0时,说明已经遍历到系统的根进程(通常是PID为1的
systemd或init进程),此时停止循环。
注意事项
- 该方案仅适用于Linux系统,其他类Unix系统(如BSD、macOS)的进程信息获取方式不同(比如macOS用
proc_pidinfo())。 - 需要确保程序有足够的权限读取
/proc目录下的文件,普通用户一般可以读取自己进程的信息,读取其他用户的进程可能需要root权限。
内容的提问来源于stack exchange,提问作者Curious_Mind
相关产品推荐
相关产品推荐

