Kann mir jemand das folgende Beispiel von os.fork () erklären?

8

[Code aus der Programmierung von Python 4th Edition von Mark Lutz]

%Vor%

Was der Code beim Ausführen ausgibt:

%Vor%

Dinge, die ich verstehe:

  1. os.fork() wird verwendet, um einen anderen Prozess parallel zum aktuellen zu starten.
  2. os.fork() erstellt eine Kopie der vorherigen Python-Sitzung und öffnet sie parallel.
  3. os.fork() gibt die ID des neuen Prozesses zurück.

Dinge, die ich nicht verstehe:

  1. Wie kommt es, dass der Wert von os.getpid() niemals geändert wird, wenn der Code ausgeführt wird?
  2. Warum wird die child() -Funktion jemals aufgerufen? Nehmen wir an, dass der Wert von newpid ! = 0 ist, dann druckt das Programm print('Hello from parent', os.getpid(), newpid) aus. Danach druckt es jedoch die Zeile von child, anstatt nach einer Eingabe zu fragen, wie es nach der if-Anweisung der Fall ist.
  3. Was macht os._exit(0) ?

Vielen Dank für Ihre Zeit. :)

    
Always Learning Forever 05.06.2014, 05:24
quelle

2 Antworten

5
  

1: Wie wird der Wert von os.getpid () nie geändert, wenn der Code ausgeführt wird?

Der Wert von os.getpid() ändert sich nie für den Elternteil, da dies immer derselbe Prozess ist. Die PID wird jedes Mal für das Kind geändert, da fork() immer einen brandneuen Kindprozess-Klon mit seiner eigenen PID erstellt.

  

2: Warum wird die Funktion child () jemals aufgerufen? Nehmen wir an, dass der Wert von newpid! = 0 ist, dann druckt das Programm print ('Hallo von Eltern', os.getpid (), newpid). Danach druckt es jedoch die Zeile von child, anstatt nach einer Eingabe zu fragen, wie es nach der if-Anweisung der Fall ist.

Der untergeordnete Prozess wird aufgerufen, weil jetzt zwei Prozesse ausgeführt werden. Einer nannte die Funktion child() , der andere die Funktion print . Sie kämpfen einfach dafür, auf dem Bildschirm zu drucken, und in diesem Fall haben Sie zuerst gesehen, dass der übergeordnete Ausdruck "win" lautet.

  

3: Was macht os._exit (0)?

Siehe hier: Ссылка

  

Beenden Sie den Prozess mit dem Status n, ohne Bereinigungshandler aufzurufen, STDIO-Puffer zu leeren usw..

    
Martin Konecny 05.06.2014, 05:30
quelle
2
  1. Weil Ihr Elternprozess immer dieselbe PID hat, solange er läuft ( while True: ).
  2. Das Kind ist eigentlich eine Kopie des Elternteils. Das macht os.fork ! Und die Funktion gibt die PID des Kindes an den Eltern zurück. Daher führt der Elternteil den zweiten Teil der if else -Anweisung aus, während alle Kinder den ersten Teil ausführen, weil os.fork für untergeordnete Prozesse eine 0 zurückgibt.
  3. os._exit ist im Wesentlichen eine abgespeckte Version von os.exit() und ist für untergeordnete Prozesse gedacht.
Don Question 05.06.2014 05:38
quelle

Tags und Links