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

18

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

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

    
задан hasen 06.10.2009 в 15:30
источник
  • Посмотрите на системный вызов sysctl () и эту ссылку. objectpark.net/parentpid.html –  vpram86 06.10.2009 в 15:37
  • @Aviator, почему комментарий, а не ответ? –  hasen 06.10.2009 в 15:41

5 ответов

23

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

Вы найдете ppid как 4-й параметр / proc / pid / stat

    
ответ дан Arkaitz Jimenez 06.10.2009 в 15:42
  • хорошо, какая часть / proc / <pid> / содержит родительский pid? –  hasen 06.10.2009 в 15:55
  • Параметр 4 en / proc / pid / stat –  Arkaitz Jimenez 06.10.2009 в 16:01
  • Ага, потрясающе! Можете ли вы отредактировать ответ, чтобы добавить это к нему? –  hasen 06.10.2009 в 16:15
  • Если кто-то ищет готовый к использованию код, я привел пример: gist.github.com/fclairamb/a16a4237c46440bdb172 –  Florent 06.10.2014 в 22:30
  • Ваш пример сильно усложняется, когда имя программы содержит пробелы :). –  Michał Górny 24.01.2015 в 10:49
10

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

    
ответ дан Samuel Kerrien 16.05.2012 в 10:08
  • Удивительный простой ответ. Для команды, которую вы можете скопировать / вставить, чтобы увидеть ее в действии, попробуйте ps -p $$ -o ppid =. $$ - текущий идентификатор процесса. –  Jess 18.04.2013 в 18:53
4

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

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

    
ответ дан Pejman 09.01.2017 в 19:24
2

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

    
ответ дан vpram86 06.10.2009 в 15:44
  • Попытка «слепо-складчато», не знаю, почему это не совсем компилируется. это только для OS X? Предполагается ли работать на Linux? –  hasen 06.10.2009 в 15:51
  • Он будет работать только для BSD и OS X .. –  vpram86 06.10.2009 в 17:45
  • вы должны создать более удобную гиперссылку. w3.org/QA/Tips/noClickHere –  Jeff 16.02.2016 в 00:36
0

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

cat /proc/<pid>/status | grep PPid:
    
ответ дан Saurabh Sengar 16.10.2015 в 13:50