
Wenn der fork
Aufruf zum Erstellen eines neuen Prozesses ausgeführt wird und dieser erfolgreich ist, wird entweder 0
das untergeordnete Element oder das übergeordnete Element zurückgegeben.
Ich habe die Idee dahinter nicht verstanden. Warum kehrt nicht fork
einfach always child
oder always zurück parent
?
Antwort1
Wenn Sie fork()
, wird der ausgeführte Code in zwei Prozessen ausgeführt (vorausgesetzt, die Verzweigung ist erfolgreich): Ein Prozess ist der übergeordnete Prozess, der andere der untergeordnete Prozess. fork()
gibt im untergeordneten Prozess 0 und im übergeordneten Prozess die untergeordnete PID zurück: Es ist vollständig deterministisch.
So können Sie nach dem bestimmen, fork()
ob Sie im übergeordneten oder im untergeordneten System arbeiten. (Und auch, woher das übergeordnete System die PID des untergeordneten Systems kennt – es muss irgendwann darauf warten.)
Im Detail:
- der zukünftige übergeordnete Prozess ruft auf
fork()
; - Der Kernel erstellt einen neuen Prozess, der das Kind ist, und richtet verschiedene Dinge entsprechend ein – aber beide Prozesse laufender gleiche Codeund „warten“ auf eine Rückgabe derselben Funktion;
- beide Prozesse laufen weiter(nicht unbedingt sofort und nicht unbedingt gleichzeitig, aber das ist nebensächlich):
fork()
gibt 0 an den untergeordneten Prozess zurück, der fortfährt und diese Information verwendet, um zu bestimmen, dass es sich um den untergeordneten Prozess handelt;fork()
gibt die PID des untergeordneten Prozesses an den übergeordneten Prozess zurück, der fortfährt und diese Informationen verwendet, um zu bestimmen, dass es sich um den übergeordneten Prozess handelt.
Antwort2
Der fork()
Systemaufruf wird immer „zweimal zurückgegeben“ (es sei denn, er schlägt fehl). Im übergeordneten Prozess gibt er die PID des untergeordneten Prozesses zurück, im untergeordneten Prozess gibt er Null zurück.
Der übliche Ablauf ist
pid_t pid;
int status;
pid = fork();
if (pid == 0) {
run_child_stuff();
exit(0);
} else if (pid > 0) {
run_parent_stuff();
wait(&status); /* wait for child to exit */
} else {
/* handle failure to fork */
}
... o.ä.