以编程方式获取另一个进程的父 pid?

Posted

技术标签:

【中文标题】以编程方式获取另一个进程的父 pid?【英文标题】:Programmatically get parent pid of another process? 【发布时间】:2010-12-04 06:43:13 【问题描述】:

我尝试了谷歌,但发现 getppid() 获取了 当前 进程的父 pid。

我需要像getppid(some_other_pid) 这样的东西,有这样的东西吗?基本上取某个进程的pid并返回父进程的pid。

【问题讨论】:

看看 sysctl() 系统调用和这个链接。 objectpark.net/parentpid.html @Aviator,为什么要评论而不是回答? 【参考方案1】:

我认为最简单的方法是打开“/proc”并解析内容。

你会发现 ppid 是 /proc/pid/stat 的第四个参数

【讨论】:

好吧,/proc/<pid>/ 的哪一部分拥有父 pid? 第4个参数en /proc/pid/stat 如果有人在寻找一个现成的代码,我做了一个例子:gist.github.com/fclairamb/a16a4237c46440bdb172 当程序名称包含空格时,您的示例将失败:)。 当它包含 () 时就更难了【参考方案2】:

或者从 unix shell 你可以试试ps -p <child_pid> -o ppid=

【讨论】:

很棒的简单答案。对于命令,您可以复制/粘贴以查看它的运行情况,请尝试 ps -p $$ -o ppid=。 $$ 是当前进程 ID。【参考方案3】:

我迟到了 7 年,但对于任何可能偶然发现这个问题的人,这是 OS X 上的替代解决方案。此处发布的其他答案是正确的,sysctl() 可以完成这项工作,但您也可以使用 @ 987654322@获取有关进程的大量有用信息。

#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;

显然,需要额外的错误检查。

【讨论】:

【参考方案4】:

你可以看看sysctl()系统调用和this链接。

【讨论】:

“盲目地”尝试它,不知道为什么它不能完全编译。它仅适用于 OS X 吗?它应该在linux上工作吗? 您应该创建一个更友好的超链接。 w3.org/QA/Tips/noClickHere【参考方案5】:

从 proc 条目中获取它的另一种方法:

cat /proc/<pid>/status | grep PPid:

【讨论】:

为什么不只是grep PPid: /proc/&lt;pid&gt;/status 一切都好【参考方案6】:

我们也可以使用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

【讨论】:

通过“编程方式”,问题是要求 API,而不是命令行程序。

以上是关于以编程方式获取另一个进程的父 pid?的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一台机器上以编程方式获取通过 AF_INET 套接字连接到我的代理的进程的 PID?

以编程方式从 Grid 进程生成第二个 Selenium Grid 节点作为另一个进程时的 ParameterException

多进程的调用

以编程方式获取 Windows 中所有已安装更新的列表

从后台进程获取 PID 作为另一个用户运行

如何以编程方式获取进程使用的内存量? [复制]