Программно получить родительский pid другого процесса?

Я попробовал поискать в Google, но нашел getppid(), который получает родительский pid текущего процесса.

Мне нужно что-то вроде getppid(some_other_pid), есть такое? В основном берет pid некоторого процесса и возвращает pid родительского процесса.


person hasen    schedule 06.10.2009    source источник
comment
Взгляните на системный вызов sysctl() и эту ссылку. objectpark.net/parentpid.html   -  person vpram86    schedule 06.10.2009
comment
@Aviator, почему комментарий, а не ответ?   -  person hasen    schedule 06.10.2009


Ответы (6)


Я думаю, что проще всего было бы открыть "/proc" и проанализировать содержимое.

Вы найдете ppid в качестве 4-го параметра /proc/pid/stat.

person Arkaitz Jimenez    schedule 06.10.2009
comment
хорошо, какая часть /proc/<pid>/ содержит родительский pid? - person hasen; 06.10.2009
comment
Параметр 4 en /proc/pid/stat - person Arkaitz Jimenez; 06.10.2009
comment
Если кто-то ищет готовый код, я сделал пример: gist.github.com/ fclairamb/a16a4237c46440bdb172 - person Florent; 07.10.2014
comment
Ваш пример терпит неудачу, когда имя программы содержит пробелы :). - person Michał Górny; 24.01.2015
comment
Еще сложнее, когда он содержит ( и ) - person Calmarius; 05.07.2017
comment
< /proc/pid/stat sed 's|.* (.*) [^ ] \([0-9]*\) .*|\1|' работает, даже если в имени исполняемого файла есть пробелы (оно совпадает с заключенным в него именем (), пропускает односимвольное поле состояния, а затем захватывает цифры PPID). - person arielCo; 23.01.2019

или из оболочки unix можно попробовать ps -p <child_pid> -o ppid=

person Samuel Kerrien    schedule 16.05.2012
comment
Потрясающий простой ответ. Для команды, которую вы можете скопировать/вставить, чтобы увидеть ее в действии, попробуйте ps -p $$ -o ppid=. $$ — текущий идентификатор процесса. - person Jess; 18.04.2013

Я опоздал на вечеринку на 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;
}

Очевидно, требуется дополнительная проверка ошибок.

person Pejman    schedule 09.01.2017

Вы можете ознакомиться с системным вызовом sysctl() и этой ссылкой.

person vpram86    schedule 06.10.2009
comment
Пробую с завязанными глазами, не уверен, почему это не совсем компилируется. это только для OS X? Он должен работать на линуксе? - person hasen; 06.10.2009
comment
вам следует создать более дружественную гиперссылку. w3.org/QA/Tips/noClickHere - person Jeff; 16.02.2016

еще один способ получить его из записи proc:

cat /proc/<pid>/status | grep PPid:
person Saurabh Sengar    schedule 16.10.2015
comment
Почему бы не просто grep PPid: /proc/<pid>/status? - person codeforester; 12.07.2019
comment
все в порядке - person Saurabh Sengar; 17.07.2019

Мы также можем использовать команду 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.

person Krishna Kanth Yenumula    schedule 16.09.2019