我尝试谷歌,但发现
getppid()
它获取当前进程的父PID。
我需要类似
getppid(some_other_pid)
的东西,有这样的东西吗?基本上获取某个进程的 pid 并返回父进程的 pid。
我认为最简单的事情就是打开“/proc”并解析内容。
你会发现 ppid 作为 /proc/pid/stat 的第四个参数
在 C 中,libproc 有一个
get_proc_stats
函数用于解析该文件:请参阅 给定子 PID,如何获取父 PID 作为示例。
或者从 Unix shell 中你可以尝试
ps -p <child_pid> -o ppid=
我迟到了 7 年,但对于任何可能偶然发现这个问题的人来说,这里有一个 OS X 上的替代解决方案。这里发布的其他答案是正确的,
sysctl()
可以完成这项工作,但你也可以使用 proc_pidinfo
获得有关流程的大量有用信息。
#include <libproc.h>
int getppid(const pid_t pid)
{
proc_bsdinfo info;
proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &info, sizeof(info));
return info.pbi_ppid;
}
显然,需要额外的错误检查。
从 proc 条目获取它的另一种方法:
cat /proc/<pid>/status | grep PPid:
我们也可以使用
pstree
命令。
pstree -p -s <pid of the process>
pstree -s
给出了所有祖先的树。添加 -p
也会给你 pid。
示例:假设有一个pid=6206的进程。使用
pstree
命令
pstree -p -s 6206
您将获得进程树。
systemd(1)───lightdm(1066)───lightdm(1191)───upstart(1360)───gnome-terminal-(5222)───bash(5229)───cpu-print(6206)
这里父PID是5229
仅使用标准库用纯 C 语言制作此内容的简单方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXBUF (BUFSIZ * 2)
int pgetppid(int pid) {
int ppid;
char buf[MAXBUF];
char procname[32]; // Holds /proc/4294967296/status\0
FILE *fp;
snprintf(procname, sizeof(procname), "/proc/%u/status", pid);
fp = fopen(procname, "r");
if (fp != NULL) {
size_t ret = fread(buf, sizeof(char), MAXBUF-1, fp);
if (!ret) {
return 0;
} else {
buf[ret++] = '\0'; // Terminate it.
}
}
fclose(fp);
char *ppid_loc = strstr(buf, "\nPPid:");
if (ppid_loc) {
ppid = sscanf(ppid_loc, "\nPPid:%d", &ppid);
if (!ppid || ppid == EOF) {
return 0;
}
return ppid;
} else {
return 0;
}
}
int main () {
int ppid, pid = 373; // my current cron pid
ppid = pgetppid(pid);
printf("PPid = %d\n", ppid);
}
在我的例子中,当前进程在终端中运行的父进程:
ps | grep -E -m 1 -o "[0-9]+" | head -1