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

问题描述 投票:0回答:8

我尝试谷歌,但发现

getppid()
它获取当前进程的父PID。

我需要类似

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

linux process operating-system pid
8个回答
38
投票

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

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

在 C 中,libproc 有一个

get_proc_stats
函数用于解析该文件:请参阅 给定子 PID,如何获取父 PID 作为示例。


17
投票

或者从 Unix shell 中你可以尝试

ps -p <child_pid> -o ppid=


8
投票

我迟到了 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;
}

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


3
投票

您可以查看

sysctl()
系统调用和this链接。


1
投票

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

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

0
投票

我们也可以使用

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


0
投票

仅使用标准库用纯 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);
}

0
投票

在我的例子中,当前进程在终端中运行的父进程:

ps | grep -E -m 1 -o "[0-9]+" | head -1
© www.soinside.com 2019 - 2024. All rights reserved.