2012-09-26 12 views
5

Desidero sapere nel mio programma se esiste un processo con un determinato ID. Ho implementato la seguente funzione per ottenere ciò, che controlla se esiste /proc/<PID>/maps. Tuttavia, noto che anche se uccido una funzione con un dato ID, questa funzione restituisce ancora 1. C'è un modo migliore per ottenere ciò che sto cercando di fare e, in caso contrario, qual è il problema con questo codice, se esiste, perché? è vero tornando 1 quando dovrebbe essere tornando 0.Determinare se esiste un processo dal suo ID processo

int proc_exists(pid_t pid) 
{ 
    stringstream ss (stringstream::out); 

    ss << dec << pid; 

    string path = "/proc/" + ss.str() + "/maps"; 

    ifstream fp(path.c_str()); 

    if (!fp) 
     return 0; 
    return 1; 
} 
+0

Stai aspettando tra l'emissione dell'uccisione e il controllo dell'uscita? Cosa succede se fai 'ps -ef | grep _PID_ '? –

+0

Ya sto chiamando proc_exists in un ciclo, in attesa che il processo venga ucciso. Ora controllo con ps -ef | grep, dice la funzione defunt. Qual è la funzione defunt? – pythonic

+0

Significa che il processo non è più in esecuzione; Tuttavia, non è stato ripulito tramite una chiamata a 'wait()' o 'waitpid()'. È ancora un bersaglio valido per i segnali e ha ancora una voce nella tabella dei processi. –

risposta

8

Usa kill() con il segnale 0:

if (0 == kill(pid, 0)) 
{ 
    // Process exists. 
} 

Da man kill:

Se sig è 0, n o viene inviato un segnale, ma il controllo degli errori viene ancora eseguito; questo può essere usato per verificare l'esistenza di un ID di processo o di un ID di un gruppo di processi.

+0

Non dimenticare che i PID sono riciclati. Un determinato attaccante può passare attraverso tutti i PID con alcune forchette veloci e ottenere il proprio processo per avere lo stesso PID di quello che stai cercando. –

+0

Non funziona neanche sembra. – pythonic

+0

@ user1018562, cosa restituisce 'kill()' e qual è il valore di 'errno'? – hmjd

5

Per superare la possibilità del processo in atto, come zombie, ho usato il seguente:

bool is_pid_running(pid_t pid) { 

    while(waitpid(-1, 0, WNOHANG) > 0) { 
     // Wait for defunct.... 
    } 

    if (0 == kill(pid, 0)) 
     return 1; // Process exists 

    return 0; 
} 

funziona per me!

Problemi correlati