Ich versuche UNIX-Programmierung zu lernen und bin auf eine Frage bezüglich fork () gestoßen. Ich verstehe, dass fork () einen identischen Prozess wie der aktuell ausgeführte Prozess erstellt, aber wo beginnt er? Zum Beispiel, wenn ich Code habe
int main (int argc, char **argv)
{
int retval;
printf ("This is most definitely the parent process\n");
fflush (stdout);
retval = fork ();
printf ("Which process printed this?\n");
return (EXIT_SUCCESS);
}
Die Ausgabe ist:
Dies ist mit Sicherheit der übergeordnete Prozess.
Welcher Prozess hat dies gedruckt?
Welcher Prozess hat das gedruckt?
Ich dachte, das fork()
schafft den gleichen Prozess, also habe ich anfangs gedacht, dass in diesem Programm der fork()
Aufruf für immer rekursiv aufgerufen wird. Ich vermute, dass ein neuer Prozess, der von erstellt wurde, fork()
nach dem fork()
Aufruf startet ?
Wenn ich den folgenden Code hinzufüge, um zwischen einem übergeordneten und einem untergeordneten Prozess zu unterscheiden,
if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());
Wo beginnt nach dem Aufruf von fork () die Ausführung des untergeordneten Prozesses?
man fork
ist sicher genug, um deine Frage zu beantworten, übrigensAntworten:
Der neue Prozess wird innerhalb des
fork()
Aufrufs erstellt und kehrt zunächst genau wie der übergeordnete Prozess von dort zurück. Der Rückgabewert (in dem Sie gespeichert habenretval
) vonfork()
lautet:Ihr Testcode funktioniert ordnungsgemäß. Es speichert den Rückgabewert von
fork()
inchild_pid
undif
prüft, ob es 0 ist oder nicht (obwohl es nicht auf Fehler prüft).quelle
Ja. Lassen Sie uns die Zeilen nummerieren:
Der Ablauf der Ausführung ist:
... was genau die Ausgabe erklärt, die Sie erhalten haben.
Wenn Sie wissen möchten, wie sich das ursprüngliche und das gegabelte Programm möglicherweise unterschiedlich verhalten können, da sie notwendigerweise denselben Code verwenden, lesen Sie die Antwort von Michael Mrozek.
quelle
Die wirkliche Lösung dafür ist
quelle
Unabhängig davon, ob der Code direkt nach dem
fork()
in den untergeordneten Prozess kopiert wird und der übergeordnete und der untergeordnete Prozess nicht vertauscht werden, handelt es sich um zwei verschiedene Entitäten mit derselben (duplizierten, nicht gemeinsam genutzten) Umgebung.Nun sehen Sie Ihre Ausgabe ...
quelle