Ablauf bei fork(); fork();

Hallo,

Ich bin mir nicht sicher, wie das Ergebnis von fork(); sleep(2); fork(); aussieht…

Laut Literatur komme ich auf 3 Varianten, kann mir aber nicht erklären, welche nun stimmt.

Bei:
fork();
sleep(2); // das hier 2 sec Pause sind, ist klar
fork();

Variante 1:
Prozess A bekommt einen Kindprozess B.
Prozess A bekommt einen zweiten Kindprozess C.

Variante 2:
Prozess A bekommt einen Kindprozess B.
Kindprozess B bekommt einen Kindprozess C.

Variante 3:
Prozess A bekommt einen Kindprozess B.
Prozesse A und B bekommen je einen Kindprozess (C und D).

Welcher Gedankengang stimmt nun?

Danke im vorraus für die Antworten.

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.

Alle Angaben bezogen auf Python.

HTH

Hallo,

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!).

Gruß

Andreas

1 Like

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.

Gruß