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

如何用C语言底层函数获取指定PID的PPID

获取指定PID对应PPID的C语言底层实现方案

Linux 平台实现

Linux系统提供了/proc虚拟文件系统,可直接读取进程的状态信息来获取PPID,无需依赖外部命令。

方式1:读取/proc/[pid]/stat文件

/proc/[pid]/stat文件的第4个字段即为目标进程的PPID,代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

pid_t get_ppid(pid_t pid) {
    char path[256];
    FILE *fp;
    pid_t ppid = -1;

    snprintf(path, sizeof(path), "/proc/%d/stat", pid);
    fp = fopen(path, "r");
    if (fp == NULL) {
        perror("fopen failed");
        return -1;
    }

    // 跳过前3个字段(PID、进程名、状态),读取第4个字段(PPID)
    fscanf(fp, "%*d %*s %*c %d", &ppid);
    fclose(fp);
    return ppid;
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    pid_t pid = atoi(argv[1]);
    pid_t ppid = get_ppid(pid);
    if (ppid != -1) {
        printf("PID %d's PPID is %d\n", pid, ppid);
    }
    return EXIT_SUCCESS;
}

方式2:读取/proc/[pid]/status文件

该文件可读性更强,直接查找PPid:字段即可,代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

pid_t get_ppid(pid_t pid) {
    char path[256];
    FILE *fp;
    char line[256];
    pid_t ppid = -1;

    snprintf(path, sizeof(path), "/proc/%d/status", pid);
    fp = fopen(path, "r");
    if (fp == NULL) {
        perror("fopen failed");
        return -1;
    }

    while (fgets(line, sizeof(line), fp) != NULL) {
        if (strncmp(line, "PPid:", 5) == 0) {
            sscanf(line, "PPid: %d", &ppid);
            break;
        }
    }
    fclose(fp);
    return ppid;
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    pid_t pid = atoi(argv[1]);
    pid_t ppid = get_ppid(pid);
    if (ppid != -1) {
        printf("PID %d's PPID is %d\n", pid, ppid);
    }
    return EXIT_SUCCESS;
}

BSD/macOS 平台实现

这类系统没有/proc文件系统,需通过sysctl系统调用查询进程信息,代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <errno.h>

pid_t get_ppid(pid_t pid) {
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
    struct kinfo_proc proc_info;
    size_t size = sizeof(proc_info);

    if (sysctl(mib, 4, &proc_info, &size, NULL, 0) == -1) {
        perror("sysctl failed");
        return -1;
    }
    return proc_info.kp_eproc.e_ppid;
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    pid_t pid = atoi(argv[1]);
    pid_t ppid = get_ppid(pid);
    if (ppid != -1) {
        printf("PID %d's PPID is %d\n", pid, ppid);
    }
    return EXIT_SUCCESS;
}

注意事项

  • 需确保当前进程有足够权限读取目标进程的信息,普通用户通常可读取大部分进程的PPID。
  • 跨平台开发时,可通过#ifdef __linux__、#ifdef __APPLE__等条件编译指令适配不同系统。

内容的提问来源于stack exchange,提问作者Tanguy Macé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:10:33