Warum gibt Fork manchmal das übergeordnete Element und manchmal das untergeordnete Element zurück?

Warum gibt Fork manchmal das übergeordnete Element und manchmal das untergeordnete Element zurück?

Wenn der forkAufruf zum Erstellen eines neuen Prozesses ausgeführt wird und dieser erfolgreich ist, wird entweder 0das untergeordnete Element oder das übergeordnete Element zurückgegeben.

Ich habe die Idee dahinter nicht verstanden. Warum kehrt nicht forkeinfach always childoder 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.ä.

verwandte Informationen