我试过google,但是找到了getppid(),它获取了 current 进程的父进程pid。我需要getppid(some_other_pid)这样的东西,有这样的东西吗?基本上获取某个进程的pid并返回父进程的pid。
getppid()
getppid(some_other_pid)
ao218c7q1#
我认为最简单的方法是打开“/proc”并解析其内容。您会发现ppid是/proc/pid/stat的第4个参数在C中,libproc有一个get_proc_stats函数来解析该文件:参见Given a child PID how can you get the parent PID作为示例。
get_proc_stats
wdebmtf22#
或者在unix shell中,可以尝试ps -p <child_pid> -o ppid=
ps -p <child_pid> -o ppid=
k10s72fa3#
我迟到了7年,但对于任何可能偶然发现这个问题的人来说,这里有一个在OSX上的替代解决方案。这里的其他答案都是正确的,sysctl()可以完成这项工作,但是你也可以使用proc_pidinfo来获得关于进程的许多有用信息。
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; }
显然,需要额外的错误检查。
pvabu6sv4#
您可以查看sysctl()系统调用和this链接。
cidc1ykv5#
还有一种方法可以从proc entry获取它:
cat /proc/<pid>/status | grep PPid:
hkmswyz66#
我们也可以使用pstree命令。
pstree
pstree -p -s <pid of the process>
pstree -s给出了所有祖先的树。加上-p也会给你给予pid。例如:假设有一个pid=6206的进程。使用pstree命令
pstree -s
-p
pstree -p -s 6206
你会得到一个进程树。
systemd(1)───lightdm(1066)───lightdm(1191)───upstart(1360)───gnome-terminal-(5222)───bash(5229)───cpu-print(6206)
这里的父PID是5229
bsxbgnwa7#
一个简单的方法在纯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); }
hkmswyz68#
在我的例子中,在终端中运行的进程的父PID:
ps | grep -E -m 1 -o "[0-9]{4,}"
8条答案
按热度按时间ao218c7q1#
我认为最简单的方法是打开“/proc”并解析其内容。
您会发现ppid是/proc/pid/stat的第4个参数
在C中,libproc有一个
get_proc_stats
函数来解析该文件:参见Given a child PID how can you get the parent PID作为示例。wdebmtf22#
或者在unix shell中,可以尝试
ps -p <child_pid> -o ppid=
k10s72fa3#
我迟到了7年,但对于任何可能偶然发现这个问题的人来说,这里有一个在OSX上的替代解决方案。这里的其他答案都是正确的,
sysctl()
可以完成这项工作,但是你也可以使用proc_pidinfo
来获得关于进程的许多有用信息。显然,需要额外的错误检查。
pvabu6sv4#
您可以查看
sysctl()
系统调用和this链接。cidc1ykv5#
还有一种方法可以从proc entry获取它:
hkmswyz66#
我们也可以使用
pstree
命令。pstree -s
给出了所有祖先的树。加上-p
也会给你给予pid。例如:假设有一个pid=6206的进程。使用
pstree
命令你会得到一个进程树。
这里的父PID是5229
bsxbgnwa7#
一个简单的方法在纯C中只使用标准库:
hkmswyz68#
在我的例子中,在终端中运行的进程的父PID: