Erstellen von 10 Child-Prozessen



  • Hallo,

    ich will ein Programm schreiben, bei dem ein Elternprozess 10 Child-Prozesse erzeugt und dann im nachhinein den Exit-Status der einzelnen Childs abfragt.

    mein code:

    int main(void)
    {
        pid_t elternprozess; 
        static int status, i, pid_number;   
    
        elternprozess = fork();
    
        for(i = 0; i < 10; i++)
        {
    
            if(elternprozess == 0) // child
            {
                printf("Child number %d started. PID = %d PARENT PID %d \n", i+1, getpid(), getppid()); 
                printf("Child exiting. PID = %d \n", getpid());
                exit(0); 
             }
             else if(elternprozess > 0)
             {   
               elternprozess = fork(); 
             }
        }
    
        sleep(1); 
        for(i = 0; i < 10; i++)      
        {   
            pid_number = wait(&status); 
            printf("CHILD mit PID %d hat sich mit folgendem Exit-Status: %d beendet \n", pid_number, status); 
        }
    
     return 0; 
    }
    

    Das erstellen der Child-Funktionen klappt soweit und auch das anschließende beenden, jedoch habe ich bei der for-Schleife die mir den Exit Status ausgibt das Problem, das ich 10 richtige Ausgaben (richtige PiD und exit-Status = 0) und 10 Falsche (PID = -1) erhalte.

    Kann mir jemand einen Tipp geben was ich falsch gemacht habe?

    mit freundlichen Grüßen,

    Jonny


  • Mod

    Den mal nach, was passiert, wenn in der ersten Schleife i==9 ist: Dann wird geforked, aber das dadurch erzeugte Kind wird nicht exiten, denn die Schleife endet nun. Stattdessen landet das Kind in der wait-Schleife.

    PS: Was soll denn das static? Denkst du, das hätte irgendeine Auswirkung auf das fork?



  • So einfach kann es sein..

    Das static ist noch von einer Problemstellung aus einem anderen Programm übrig geblieben.

    Herzlichen dank für deine Hilfe.



  • Die Variable ausgerechnet "elternprozess" zu nennen ist ziemlich verwirrend.

    Spricht irgendwas dagegen, etwas in der Art zu machen?

    for (i = 0; i < num_pids; ++i) {                                                                                                   
        pids[i] = fork();                                                                                                              
        if (pids[i] == 0)                                                                                                              
            exit(0);                                                                                                                   
    }
    


  • ich verstehe nicht warum du am Anfang ein fork machst, dann die Schleife startest.

    Anyway, den Exit-Status von wait zu bekommen, macht man mit dem WEXITSTATUS Makro

    pid_number = wait(&status);
    if(WIFEXITED(status))
      printf("CHILD mit PID %d hat sich mit folgendem Exit-Status: %d beendet \n", pid_number, WEXITSTATUS(status));
    else
       printf("CHILD mit PID %d hat nicht normal über exit oder _exit beendet, Exit-Status unbekannt\n", pid_number);
    }
    

    siehe man: wait(2)


Anmelden zum Antworten