如何用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é
相关产品推荐
相关产品推荐

