以编程方式获取另一个进程的父 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/<pid>/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