Ich habe versucht, fork()
Verhalten zu verstehen . Diesmal in einem for-loop
. Beachten Sie den folgenden Code:
#include <stdio.h>
void main()
{
int i;
for (i=0;i<3;i++)
{
fork();
// This printf statement is for debugging purposes
// getppid(): gets the parent process-id
// getpid(): get child process-id
printf("[%d] [%d] i=%d\n", getppid(), getpid(), i);
}
printf("[%d] [%d] hi\n", getppid(), getpid());
}
Hier ist die Ausgabe:
[6909][6936] i=0
[6909][6936] i=1
[6936][6938] i=1
[6909][6936] i=2
[6909][6936] hi
[6936][6938] i=2
[6936][6938] hi
[6938][6940] i=2
[6938][6940] hi
[1][6937] i=0
[1][6939] i=2
[1][6939] hi
[1][6937] i=1
[6937][6941] i=1
[1][6937] i=2
[1][6937] hi
[6937][6941] i=2
[6937][6941] hi
[6937][6942] i=2
[6937][6942] hi
[1][6943] i=2
[1][6943] hi
Ich bin eine sehr visuelle Person, und so kann ich die Dinge nur durch Diagramme wirklich verstehen. Mein Lehrer sagte, es würde 8 Hi- Statements geben. Ich habe den Code geschrieben und ausgeführt, und tatsächlich gab es 8 Hi- Anweisungen. Aber ich habe es wirklich nicht verstanden. Also habe ich folgendes Diagramm gezeichnet:
Diagramm aktualisiert, um Kommentare wiederzugeben :)
Beobachtungen:
- Der übergeordnete Prozess (main) muss die Schleife dreimal durchlaufen. Dann wird printf aufgerufen
- Bei jeder Iteration der übergeordneten for-Schleife wird ein fork () aufgerufen
- Nach jedem Aufruf von fork () wird i inkrementiert, und so startet jedes Kind eine for-Schleife von i, bevor es inkrementiert wird
- Am Ende jeder for-Schleife wird "hi" gedruckt
Hier sind meine Fragen:
- Ist mein Diagramm korrekt?
- Warum gibt es zwei Instanzen
i=0
in der Ausgabe? - Welcher Wert von
i
wird nach der Gabelung () auf jedes Kind übertragen? Wenn der gleiche Wert von übertrageni
wird, wann hört dann das "Gabeln" auf? - Ist es immer so, dass
2^n - 1
die Anzahl der gegabelten Kinder gezählt werden kann? Also, hiern=3
, was bedeutet2^3 - 1 = 8 - 1 = 7
Kinder, was ist richtig?
i
die PID und die übergeordnete PID nach dem ausdruckenfork()
. Es sollte einfach sein zu verfolgen, was passiert