2012-09-26 10 views
5

Ich möchte in meinem Programm wissen, ob ein Prozess mit einer bestimmten ID existiert. Ich habe die folgende Funktion implementiert, um das zu erreichen, die prüft, ob /proc/<PID>/maps existiert. Ich stelle jedoch fest, dass selbst wenn ich eine Funktion mit einer bestimmten ID abbringe, diese Funktion immer noch 1 zurückgibt. Gibt es einen besseren Weg, um das zu erreichen, was ich versuche, und wenn nicht, was ist das Problem mit diesem Code, wenn überhaupt es kehrt 1, wenn es 0.Ermitteln, ob ein Prozess von seiner Prozess ID

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

Warten Sie zwischen der Ausgabe des Kills und der Überprüfung, dass er beendet wurde? Was passiert, wenn Sie 'ps -ef | grep _PID_ '? –

+0

Ich rufe proc_exists in einer Schleife auf und warte darauf, dass der Prozess beendet wird. Jetzt überprüfe ich mit ps -ef | Grep, es sagt Defunt-Funktion. Was ist Defunt-Funktion? – pythonic

+0

Es bedeutet, dass der Prozess nicht mehr läuft; Es wurde jedoch nicht durch einen Aufruf von 'wait()' oder 'waitpid()' bereinigt. Es ist immer noch ein gültiges Ziel für Signale und hat immer noch einen Eintrag in der Prozesstabelle. –

Antwort

8

Verwenden kill() mit Signal 0 zurückkehren sollte:

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

Von man kill:

Wenn sig 0, dann n o Signal wird gesendet, aber die Fehlerprüfung wird noch durchgeführt; Dies kann verwendet werden, um das Vorhandensein einer Prozess-ID oder Prozessgruppen-ID zu überprüfen.

+0

Vergessen Sie nicht, dass PIDs recycelt werden. Ein entschlossener Angreifer kann alle PIDs mit einigen schnellen Gabeln durchgehen und seinen eigenen Prozess so erhalten, dass er dieselbe PID hat wie die gesuchte. –

+0

Funktioniert nicht, wie es scheint. – pythonic

+0

@ user1018562, was gibt 'kill()' zurück und was ist der Wert von 'errno'? – hmjd

5

Um die Möglichkeit der Prozess bestehenden als Zombie zu überwinden, habe ich die folgenden:

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

Es funktioniert für mich!

Verwandte Themen