Festellen ob ein Prozess nach x Sekunden beendet wurde



  • Hi,

    wie kann ich innerhalb des Vaterprozesses feststellen ob ein mit fork() erzeugter Sohnprozess nach einer bestimmten Zeit beendet wurde oder nicht?



  • waitpid(pid, NULL, WNOHANG);
    

    pid ist die prozess id des kindprozesses, auf den du testen möchtest (den bekommst du als rückgabewert von fork()).
    NULL kannst du durch einen pointer auf einen int ändern, damit du den exit status des kindprozesses speichern kannst.
    WNOHANG sagt waitpid, dass es nicht auf die terminierung des prozesses mit der pid wartet sondern sofort zurückkehrt. ist das kind schon beendet worden, gibt die funktion dessen pid zurück. ist es nicht beendet worden, gibt sie 0 zurück.

    pid_t bla = waitpid(pid, NULL, WNOHANG);
    if(bla == pid) {
      // schon beenden code
    } else if(bla == 0) {
      // kind läuft noch code
    } else {
      // fehler code
    }
    


  • Aber wie genau kann ich dabei die Zeit berücksichtigen? Angenommen sei, ich möchte mit dem Vaterprozess 10 Sekunden auf die Beendigung eines Kindprozesses warten (ohne sleep).



  • die zeit musst du anders berücksichtigen. willst du, während du die x sekunden wartest, im elternprozess weitere anweisungen ausführen? das geht mit alarm und einem signal handler für SIGALRM. in dem handler führst du dann das waitpid aus. dazu muss die pid des kindprozesses global sein.


Log in to reply