2016-02-14 18 views
5

Sto lavorando a un progetto in cui ho un numero di PID e devo scoprire quali di questi sono processi zombi e poi uccidere i loro processi genitore per uccidere il processo iniziale di zombie. Non sono sicuro se c'è un modo per scoprire quale sia il PPID di un dato PID. Qualsiasi aiuto sarebbe apprezzato.Dato un PID figlio come si può ottenere il PID genitore

+0

Possibile duplicato di [linux: genera automaticamente il padre pid di un altro processo?] (Http://stackoverflow.com/questions/1525605/linux-programmatically-get-parent-pid-of-another-process) –

+0

C'è ' get_proc_stats' in 'libproc' che avrebbe fatto ciò che volevi. Sembra che sia stato rimosso dall'interfaccia pubblica. L'alternativa è usare 'openproc' e' readproc' per ottenere il pid. Pubblicheremo una risposta ma non riesco a farlo funzionare (crash in 'readproc'). Non so quale sistema operativo stai usando, quindi potrebbe non essere applicabile. Ulteriore lettura [qui] (http://stackoverflow.com/questions/6457682/how-to-programatically-get-uid-from-pid-in-osx-using-c), [qui] (http: // goo .gl/W2BBRy) e [qui] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=731959). –

+0

La risposta migliore dipende probabilmente dai sistemi operativi a cui si sta indirizzando. Per Linux, c'è il filesystem '/ proc'; su BSD, dovrai chiamare 'sysctl()'. Non so altri sistemi ... –

risposta

2

La funzione getppid() fa che:

#include <unistd.h> 

int main() 
{ 
    pid_t ppid; 

    ppid = getppid(); 

    return (0); 
} 
+2

Questo ovviamente otterrà solo il pid genitore del processo di chiamata. L'OP vuole farlo con processi arbitrari, alcuni dei quali possono essere zombi, quindi questo non affronta la questione. –

2

Alla sorgente per il comando ps, v'è una funzione chiamata get_proc_stats definito proc/readproc.h che (tra le altre cose) restituisce il genitore pid di un dato pid. È necessario installare libproc-dev per ottenere questa funzione. È quindi possibile fare:

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

Questo è tratto da here. Non l'ho mai usato, ma secondo l'autore potrebbe essere utile.