2 Stimmen

Ernten von Zombie-Prozess - Kind

Ich übernehme Befehlszeilenargumente von Eltern zu Kind und zähle sie und drucke sie aus. Meine Frage ist, ob ich nicht sicher bin, ob ich das Kind ernte? Brauche ich nicht einfach ein exit 0 oder muss ich fork erneut aufrufen?

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{

int length = 0;
int i, n;

int     fdest[2];          // for pipe
pid_t   pid;              // Prozess-IDs
char    buffer[BUFSIZ];

if ((pid = fork()) < 0)  /* Versuch, Kinder-/Elternprozess zu erstellen */

{
    printf("Fehler beim Forken");
} 

if (pipe(fdest) < 0)          /* Versuch, Pipe zu erstellen */
    printf("Fehler bei der Pipe");

/* Elternprozess */
else if (pid > 0) {      
    close(fdest[0]);

    for(i = 1; i < argc; i++)    /* Schreiben in die Pipe */
    {
        write(fdest[1], argv[i], strlen(argv[1]));
    }

} else {   

    /* Kindprozess */
    close(fdest[1]);

    for(i = 1; i < argc; i++)
    {
        length +=( strlen(argv[i])); /* Länge der Argumente bestimmen */
    }

    n = read(fdest[0], buffer, length);
    printf("\nKind: %d Zeichen gezählt\n", n);

}
exit(0);
}

12voto

caf Punkte 224189

Nein, du beendest das Kind nicht richtig. In deinem Fall wird das Kind, wenn es vor dem Beenden des Elternprozesses fertig ist, zu einem Zombie. Dann, wenn der Elternprozess beendet ist, wird das Kind init zugewiesen (ob es bereits beendet ist und ein Zombie ist oder noch läuft). init beendet das Kind dann für dich.

Um das Kind zu beenden, füge einen Aufruf von wait() vor exit hinzu.

Übrigens, du hast noch einen anderen Fehler - du erstellst das Pipe nach dem fork, sodass der Eltern- und Kindprozess jeweils eine (verschiedene) Pipe erstellen - sie sind nicht verbunden. Verschiebe das if (pipe(... nach oben, bevor das fork() stattfindet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X