Wie teste ich ob ein best. Prozess laeuft?



  • Hallo,

    1. Wie teste ich ob ein bestimmter Prozess (PID) laeuft, bzw ob die PID ueberhaupt existiert?

    Ich dachte das geht ganz einfach per waitpid() und WNOHANG, also so:

    // soll "returnen" wenn kein solcher prozess vorhanden ist
    if(0 >= waitpid( pid, NULL, WNOHANG) ){ return; }
    

    Nur, irgendwas mache ich dabei falsch. Getestet im Code bekomme ich immer -1 von
    waitpid(). Egal ob die pid existiert oder nicht, oder -1 ist.

    2. Wo finde ich eig. den Wert von WNOHANG auf meinem System?
    In wait.h zumindest konnte ich es nicht herauslesen. Im Netz las ich was von
    0x01 fuer WNOHANG - ist das richtig? (wegen gdb)



  • Mit man: waitpid wartest du auf einen childprozess. Ein WNOHANG bewirkt nur, dass der Aufruf sofort zurückkommt. Wenn der Prozess noch läuft wir ein Fehler angezeigt, den müsstest auswerten.

    Probier man: kill mit dem Signal 0.

    Zudem helfen die man-pages eigentlich immer weiter. Da steht drin, was für includes man benötigt, wie die Funktionen definiert sind und wie man sie richtig benutzt. Auch eine Erklärung der möglichen Fehler ist angegeben.



  • Eine weitere Frage hierzu:

    0 <= waitpid( pid, 0, WNOHANG)
    

    Gibt 1, wenn ein Child Prozess laeuft oder nicht.

    0 != kill(pid, 0)
    

    Gibt 1, wenn ein Prozess dem ich "ein Signal senden darf" existiert oder nicht. Ich bekomme von kill -1 bei existierenden Prozessen und 0 wenn sie nicht existieren. Und irgendwie auch -1 wenn die pid einfach nur ueber 0 ist.

    die Frage bleibt:
    Wie teste ich allgemein, ob eine pid einen laufenden Prozess darstellt oder nicht (egal ob von mir, von irgendjem, child oder nicht - ich will einfach nur wissen ob das Ding laeuft oder nicht)?



  • Die Antwort bleibt auch!

    Wenn du die manpages gelesen hättest, wär das kein Problem. Schau dir die Fehlercodes an. (nicht nur die Rückgabewerte!)

    Oder soll man dir alles vorkauen?



  • lagalopex schrieb:

    Schau dir die Fehlercodes an. (nicht nur die Rückgabewerte!

    Hatte ich schon gesagt, dass ich errno eig vermeiden wollte, errno scheint mit Threads manchmal etwas Schwierigkeiten zu haben (ich gebe aber zu, dass ich das hier noch nicht ausprobiert hatte)... egal, ok, danke fuer die freundliche Antwort.



  • man errno schrieb:

    errno is defined by the ISO C standard to be a modifiable lvalue of type int, and must not be explicitly declared; errno may be a macro. errno is thread-local; setting it in one thread does not affect its value in any other thread.

    Das steht zu mindest bei mir in der man-page...


Anmelden zum Antworten