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

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

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

【问题讨论】:

标签: linux operating-system process


【解决方案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,而不是命令行程序。
    猜你喜欢
    • 2011-09-07
    • 2023-04-02
    • 2017-03-24
    • 2012-06-15
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2023-03-11
    • 2011-02-01
    相关资源
    最近更新 更多