2016-02-14 15 views
5

Pracuję nad projektem, w którym mam wiele PIDów i muszę dowiedzieć się, które z nich są procesami zombie, a następnie zabić ich procesy macierzyste w celu zabicia początkowy proces zombie. Nie jestem pewien, czy istnieje jakiś sposób, aby dowiedzieć się, jaki jest PPID danego PID. Każda pomoc będzie doceniona.Biorąc pod uwagę PID dziecka, jak uzyskać rodzic PID

+0

Prawdopodobny duplikat [linux: programowo uzyskaj macierzysty pid innego procesu?] (Http://stackoverflow.com/questions/1525605/linux-programmatically-get-parent-pid-of-another-process) –

+0

Istnieje ' get_proc_stats' w 'libproc', który zrobiłby to, co chcesz. Wygląda na to, że został usunięty z interfejsu publicznego. Alternatywą jest użycie 'openproc' i' readproc' do pobrania pid. Wpisuję odpowiedź, ale nie mogę sam tego zrobić (crash w 'readproc'). Nie wiem, którego używasz, więc może nie mieć zastosowania. Więcej informacji [tutaj] (http://stackoverflow.com/questions/6457682/how-to-programatically-get-uid-from-pid-in-osx-using-c), [tutaj] (http: // goo .gl/W2BBRy) i [tutaj] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=731959). –

+0

Najlepsza odpowiedź jest prawdopodobnie zależna od systemu operacyjnego, na który kierujesz reklamy. Dla systemu Linux istnieje system plików '/ proc'; na BSD, musisz wywołać 'sysctl()'. Nie wiem o innych systemach ... –

Odpowiedz

2

Funkcja getppid() robi:

#include <unistd.h> 

int main() 
{ 
    pid_t ppid; 

    ppid = getppid(); 

    return (0); 
} 
+2

Oczywiście otrzyma to tylko pid rodzica procesu wywołującego. OP chce to zrobić z arbitralnymi procesami, z których niektóre mogą być zombie, więc to nie rozwiązuje problemu. –

2

Na źródło polecenia ps, jest funkcja o nazwie get_proc_stats zdefiniowane w proc/readproc.h że (między innymi) zwraca rodzica pid danego pid. Aby uzyskać tę funkcję, musisz zainstalować program libproc-dev. Możesz następnie wykonać:

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

Zostało to zrobione z here. Nigdy nie użyłem tego, ale według autora może to być pomocne.

Powiązane problemy