Wie kann _do_fork () zwei verschiedene PIDs zurückgeben (eine für den Elternprozess und eine für den Kindprozess)?

8

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:

%Vor%     
Xaphanius 27.06.2017, 02:24
quelle

1 Antwort

9

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.

%Vor%

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.

    
Ajay Brahmakshatriya 27.06.2017, 04:09
quelle

Tags und Links