Laut Literatur komme ich auf 3 Varianten, kann mir aber nicht
erklären, welche nun stimmt.
Der folgende Code sollte (dank der Kommentare) eigentlich selbserklärend sein:
def printHello():
...
if os.fork() == 0:
## fork returns 0 in the process copy =\> this is where we call our function
printHello()
else:
## If fork doesn't return 0, we're in the original =\> other code
...
Beide Prozesse laufen an gleicher Stelle weiter, also erzeugen beide unabhängig einen neuen Childprozess. Am Ende gibt es vier Prozesse, A, das Kind B von A, sowie von beiden je ein weiteres Kind C.
Soweit, so trivial. Allerdings sind beide C zwar unterscheidbar (sie besitzen versch. PIDs), sind aber selbst nicht mehr in der Lage, zu erkennen, wer ihre Eltern sind (PPID = 1).
Lass dir einfach nach jedem Fork getpid() und getppid() ausgeben, dann kannst du leicht nachvollziehen, was passiert.
Allerdings sind beide C zwar
unterscheidbar (sie besitzen versch. PIDs), sind aber selbst
nicht mehr in der Lage, zu erkennen, wer ihre Eltern sind
(PPID = 1).
das stimmt so nicht: PPID = 1 beobachtest du in den Kindern nur, wenn deren Eltern mittlerweile schon beendet sind; dann werden die „Waisenkinder“ nämlich dem init-Prozess (PID 1) unterstellt. Direkt nach dem fork() und solange die Eltern noch existieren, kennen die C auch ihre Eltern (gerade auch noch mal in Python ausprobiert; os.wait() in den Eltern nicht vergessen!).
das stimmt so nicht: PPID = 1 beobachtest du in den Kindern
nur, wenn deren Eltern mittlerweile schon beendet sind; dann
werden die „Waisenkinder“ nämlich dem init-Prozess (PID 1)
unterstellt.
Hätte ich eigentlich auch selbst drauf kommen können.