2016-02-14 2 views
5

Я работаю над проектом, где у меня есть несколько PID, и я должен выяснить, какие из них являются зомби-процессами, а затем убить их родительские процессы, чтобы убить начальный процесс зомби. Я не уверен, есть ли способ узнать, что такое идентификатор PPID данного PID. Любая помощь будет оценена по достоинству.Учитывая дочерний PID, как вы можете получить родительский PID

+0

Возможный дубликат [linux: программно получить родительский pid другого процесса?] (Http://stackoverflow.com/questions/1525605/linux-programmatically-get-parent-pid-of-another-process) –

+0

Есть ' get_proc_stats' в 'libproc', который сделал бы то, что вы хотите. Кажется, он был удален из открытого интерфейса. Альтернативой является использование 'openproc' и' readproc' для получения pid. Я бы опубликовал ответ, но я не могу заставить его работать сам (авария в 'readproc'). Я не знаю, какие ОС вы используете, поэтому не может применяться. Дальнейшее чтение [здесь] (http://stackoverflow.com/questions/6457682/how-to-programatically-get-uid-from-pid-in-osx-using-c), [здесь] (http: // goo .gl/W2BBRy) и [здесь] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=731959). –

+0

Лучший ответ, вероятно, зависит от того, какие ОС вы нацеливаете. Для Linux существует файловая система '/ proc'; на BSD вам нужно будет вызвать 'sysctl()'. Я не знаю о других системах ... –

ответ

2

Функция getppid() делает это:

#include <unistd.h> 

int main() 
{ 
    pid_t ppid; 

    ppid = getppid(); 

    return (0); 
} 
+2

Это, очевидно, приведет только к родительскому pid вызывающего процесса. OP хочет сделать это с помощью произвольных процессов, некоторые из которых могут быть зомби, поэтому это не затрагивает вопрос. –

2

В источнике для команды пса, есть функция называется get_proc_stats определен в proc/readproc.h, что (помимо всего прочего) возвращает родительский pid данного pid. Чтобы получить эту функцию, вам необходимо установить libproc-dev. Затем вы можете:

#include <proc/readproc.h> 
void printppid(pid_t pid) { 
    proc_t process_info; 
    get_proc_stats(pid, &process_info); 
    printf("Parent of pid=%d is pid=%d\n", pid, process_info.ppid); 
} 

Это взято из here. Я никогда не использовал это, но, согласно автору, это может быть полезно.

Смежные вопросы