erst fork, dann exec, dann kill ergibt Zombie, warum



  • Hallo,
    ich erzeuge einen Child Prozess mittels fork(), dann rufe ich im Child Prozess ein execve auf mit Argumenten (Programname und pointer auf pointer fuer Programmname, ein Argument und (char*) 0x0 ).Das mit execve gestartete Programm startet ordnungsgemaess.

    Spaeter versuche ich im Parent den Childprozess (dessen pid ja durch execve nun die der gestarteten Application sein sollte, wie ich es verstanden habe) zu killen, mittels kill(pid, 9). Uebrig bleibt ein Zombie. Warum?
    Was mache ich falsch? Kann ich ueberhaupt einen childprozess killen - ich habe auch execlp() ausprobiert mit dem selben resultat. Schliesse ich den Parentprozess, raeumt sich der Zombie ploetzlich auf.

    Danke im voraus



  • Zombieprozesse haben den Zweck, dass sie die Statusinformationen des Prozesses aufbewahren, bis der Elternprozess diese abfragt. Ruf einfach im Elternprozess man: wait(2) bzw. man: waitpid(2) auf und der Zombieprozess verschwindet.

    http://en.wikipedia.org/wiki/Zombie_process

    btw. SIGKILL ist nicht sehr schön und sollte erst verwendet werden, wenn der Prozess ein SIGTERM ignoriert.

    das wäre zB eine Möglichkeit

    int kill_child(pid_t p, int *status) {
      if(kill(p, SIGTERM) == -1) {
        return -1;
      }
      sleep(1); // 1 Sekunde Zeit zum beenden geben
      if(kill(p, SIGKILL) == -1 && errno != EINVAL) {
      // EINVAL == pid ungültig => Prozess hat sich beendet
        return -1;
      }
      if(waitpid(p, status, 0) == -1) {
        return -1;
      }
      return 0;
    }
    


  • Hallo,
    das loest das Problem (teilweise). Ich habe zunaechst das externe Program nicht wieder starten koennen, wegen des Zombies. Deine Loesung, aber auch schon ein einfaches wait(NULL) loescht den Zombie - auf x86. Auf der embedded Platform, auf der die Software laufen soll, geht nun auch ein re-start der externen application.

    Unschoen ist lediglich, dass bei ps -eLf auf der embedded platform immer noch als Zombie erscheint, auch wenn es offensichtlich nichts macht - woran liegt das? Haengt das damit zusammen, wann init ein generelles aufraeumen der Zombies timed und macht deshalb nichts oder kann das ein weiteres Problem sein. Die Software funktioniert soweit perfekt!? 😕


Log in to reply