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

mefy6pfw  于 12个月前  发布在  Linux
关注(0)|答案(8)|浏览(161)

我试过google,但是找到了getppid(),它获取了 current 进程的父进程pid。
我需要getppid(some_other_pid)这样的东西,有这样的东西吗?基本上获取某个进程的pid并返回父进程的pid。

ao218c7q

ao218c7q1#

我认为最简单的方法是打开“/proc”并解析其内容。
您会发现ppid是/proc/pid/stat的第4个参数
在C中,libproc有一个get_proc_stats函数来解析该文件:参见Given a child PID how can you get the parent PID作为示例。

wdebmtf2

wdebmtf22#

或者在unix shell中,可以尝试ps -p <child_pid> -o ppid=

k10s72fa

k10s72fa3#

我迟到了7年,但对于任何可能偶然发现这个问题的人来说,这里有一个在OSX上的替代解决方案。这里的其他答案都是正确的,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;
}

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

pvabu6sv

pvabu6sv4#

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

cidc1ykv

cidc1ykv5#

还有一种方法可以从proc entry获取它:

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

hkmswyz66#

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

bsxbgnwa

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);
}
hkmswyz6

hkmswyz68#

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

ps | grep -E -m 1 -o "[0-9]{4,}"

相关问题