Ich habe mir die Funktion _do_fork()
angesehen () versuchen zu verstehen, wie fork()
die untergeordnete PID für den übergeordneten Prozess und 0 für den untergeordneten Prozess zurückgibt.
Ich denke, dass nr
die PID des untergeordneten Prozesses enthält (die an den aufrufenden Prozess zurückgegeben wird), aber ich kann nicht sehen, wie sie 0 an den untergeordneten Prozess zurückgeben kann.
Die Antwort Wie kennt man fork ()? 0 zurückzusenden? sagt, dass der Rückgabewert auf dem Stapel übergeben wird, der für den neuen Prozess erstellt wurde, aber (außer es nicht wirklich zu verstehen) kann ich das nicht im Code finden .
Also, wo der Rückgabewert von 0 für den untergeordneten Prozess festgelegt ist?
Der Code der Funktion _do_fork()
wird kopiert:
Sie haben richtig erkannt, wie die neue Prozess-ID mit return nr
an den übergeordneten Prozess zurückgegeben wird. Aber Sie werden nirgends eine return 0
sehen, da dieser Code im übergeordneten Thread ausgeführt wird. Dieser Code ist nicht für den neuen Prozess, der erstellt wird.
Sehen wir uns nun die Funktion _do_fork
an.
Hier passiert all die Magie. Wenn Sie copy_process aufrufen
, ruft es intern copy_thread
auf, was ein zielspezifischer Code ist. Diese Funktion ist verantwortlich für die Verarbeitung der Thread-bezogenen Datenstrukturen.
Nun sagen wir, dass wir das Ziel als X86_64 mit der Aufrufkonvention haben, dass der Rückgabewert im %rax
-Register zurückgegeben wird. Diese Funktion kopiert dann 0
in %rax
und kopiert den Wert von return_from_fork
address in %rip
(den Anweisungszeiger).
Auf anderen Plattformen benötigt der ABI möglicherweise den Rückgabewert, um auf den Stapel zu gehen. In diesem Fall wird 0
auf den Stapel gelegt. copy_thread
ist zielspezifisch, copy_process
jedoch nicht.
Dies ist die Implementierung von copy_thread
für X86_64. Um die Zeilennummer 160 herum können Sie sehen, welche Sp-Register gesetzt sind. Und in Zeile 182 kann %ax
(welches ein Unterregister von% rax ist) auf 0 gesetzt werden.
Ich hoffe, das löscht etwas Verwirrung.
Tags und Links c linux process fork linux-kernel