You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取指定进程的所有祖先进程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;
}

代码说明

  1. /proc文件读取逻辑:get_parent_of()函数先构造目标进程的stat文件路径,打开后通过fscanf跳过前3个字段(PID、进程名、进程状态),直接读取第4个字段的PPID。
  2. 异常处理:如果目标进程不存在或无权限读取/proc文件,函数返回0,终止循环。
  3. 循环终止条件:当PPID为0时,说明已经遍历到系统的根进程(通常是PID为1的systemd或init进程),此时停止循环。

注意事项

  • 该方案仅适用于Linux系统,其他类Unix系统(如BSD、macOS)的进程信息获取方式不同(比如macOS用proc_pidinfo())。
  • 需要确保程序有足够的权限读取/proc目录下的文件,普通用户一般可以读取自己进程的信息,读取其他用户的进程可能需要root权限。

内容的提问来源于stack exchange,提问作者Curious_Mind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:05:17