Problem mit Zombieprozess



  • Hi,
    ich schreibe z.Z. ein Programm dass eine bestimmte Funktion losgelöst vom Main-Prozess in einem extra-Prozess abarbeiten soll.

    Das ganze sieht so aus:

    if((retval=fork())==-1)
      continue;
    if(retval==0) { 
      tsend(&con); 
      return 0;
    }
    

    Das Snippet stammt aus der main()-Funktion.

    Ich möchte jetzt dass ein neuer Prozess erstellt wird, tsend() ausgeführt wird und nach dessen ausführung der Kindprozess beendet wird.
    Prinzipiell klappt das auch schon ganz gut, tsend wird wie gewünscht ausgeführt und es wurden auch 2 Prozesse erzeugt. Allerdings ist der neue Prozess nach Ausführung von tsend() ein Zombie.

    Jetzt frage ich mich woran das liegt, sollte das return 0; nicht dafür sorgen dass der Kindprozess sauber beendet?

    Falls jemand einen generellen Tip hat wäre ich schon dankbar, ich bin nämlich nichtmal ganz sicher wie sich der Kindprozess bei der Ausführung exakt verhält bzw. ob der Instruction Pointer mitkopiert wird. Wenn ich allerdings mit exec das Speicherbild des Kindprozesses überschreibe gehen mir ja auch alle Variablen wie z.B. con verloren? 😕



  • Problem hat sich gelöst, auch wenn das vielleicht nicht so die feine Art ist.

    signal(SIGCLD, SIG_IGN);
    

    Damit wird SIGCLD vom Parent ignoriert. Sonst hätte man wait() oder waitpid() benutzen müssen um auf den Kindprozess zu warten.Ich denke in meinem Fall ist obiges vorgehen ok, da ich nicht auf den Rückgabewert des Prozesses angewiesen bin.



  • SIGCHLD zu ignorieren ist nicht portabel!

    static void sigchld_handler(int sig) {
      (void*)sig;
      while(waitpid(-1, 0, WNOHANG) > 0);
    }
    
    //...
      signal(SIGCHLD, sigchld_handler);
    //...
    

    ist die portablere Version und nur unwesentlich aufwendiger.



  • static void sigchld_handler(int) {
      int errno_backup = errno;  
      while(waitpid(-1, 0, WNOHANG) > 0);
      errno = errno_backup;
    }
    

Anmelden zum Antworten