Wie funktioniert fork()?



  • Ich bin eigentlich Windows-Programmierer und interessiere mich rein akademisch für die genannte Frage. Ich bin auf folgendes Beispielprogramm gestoßen:

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    int main ()
    {
       int pid, j, i;
    
       pid = fork();
    
       if (pid == 0)
       {
          /* Kindprozess
           * wenn fork eine 0 zurückgibt, befinden wir uns im Kindprozess
           */
          for (j=0; j < 10; j++)
          {
     	printf ("Kindprozess:  %d (PID: %d)\n", j, getpid());
            sleep (1);
          }
          exit (0);
       }
       else if (pid > 0)
       { 
          /* Elternprozess
           * Gibt fork einen Wert größer 0 zurück, befinden wir uns im Elternprozess
           * in pid steht die ID des Kindprozesses
           * getpid() gibt die eigene PID zurück 
           */
          for (i=0; i < 10; i++)
          {
             printf ("Elternprozess: %d (PID: %d)\n", i, getpid());
             sleep (1);
          }
       }
       else
       {   
          /* Wird ein negativer Wert zurückgegeben, ist ein Fehler aufgetreten */
          fprintf (stderr, "Error");
          exit (1);
       }
       return 0;
    }
    

    Meine Frage:
    Erzeugt nicht

    pid = fork();
    

    im Kindprozess einen neuen, weiteren Kindprozess, der wiederum einen neuen erzeugt, der wiederum ... usw.?



  • Belli schrieb:

    Erzeugt nicht

    pid = fork();
    

    im Kindprozess einen neuen, weiteren Kindprozess, der wiederum einen neuen erzeugt, der wiederum ... usw.?

    Ich nehme mal an, du gehst davon aus, dass der Kindprozess "von vorne" abläuft. Dem ist nicht so, der Kindprozess "startet" an dem Punkt nach dem fork. Und da danach kein weiteres fork kommt, wird auch keins ausgeführt.



  • Belli schrieb:

    Erzeugt nicht

    pid = fork();
    

    im Kindprozess einen neuen, weiteren Kindprozess, der wiederum einen neuen erzeugt, der wiederum ... usw.?

    Nein, fork erzeugt den zusätzlichen Prozess und kehrt dann zurück.

    Beide Prozesse setzen mit dem Check pid == 0 fort.



  • Danke schön!


Anmelden zum Antworten