działanie funkcji fork

0

czy mógłbym liczyć na pomoc w zrozumieniu działania funkcji fork na tym przykładzie? nie potrafię zrozumieć przebiegu wszystkich procesów i tego co jest wypisywane.

#include <stdio.h>
#include <unistd.h>

int main(){
int f;
printf(" przed ");
f=fork();
printf(" środek \n");
f=fork();
if(f==0) printf("\n po w potomnym ");
else printf(" po w macierzystym \n");
}

wynik:

przed środek
po w macierzystym
przed środek

po w potomnym po w macierzystym

po w potomnym

3

Bo to są zupełnie osobne outputy i ich klejność nie gra roli, moze być dowolna. Każdy proces wypisuje swoje wiadomości.

0

łącznie są 2 procesy czy 4?

2

Pierwszy proces (macierzysty) woła fork 2 razy więc ma dwójkę dzieci. Drugi fork() jest poniżej pierwszego ale poza ifem który sprawdza czy to rodzic czy dziecko, więc pierwsze dziecko też zrobi tego drugiego forka. W efekcie mamy:
proces macierzysty, pierwsze dziecko macierzystego, drugie dziecko macierzystego, pierwsze dziecko pierwszego dziecka macierzystego ;]

0

mniej więcej rozumiem sposób działania, ale nie potrafię tego zestawić z wynikiem, tzn co dokładnie jest wynikiem procesu pierwszego dziecka, drugiego itd

0

To proste. Nie da się tego zrobić. Nie ma ustalonej kolejności w jakiej outputy będą sie przeplatać po wykonaniu fork(). Jedyne czego możesz być pewien to to, że pierwsze "przed" pochodzi z procesu macierzystego. Wszystkie pozostałe komunikaty mogą pochodzić zarówno z macierzystego jak i z pochodnych.

0

Procesy wykonują się równolegle. Ciesz się, że literki w outpucie się nie poplątały, równie dobrze mogłeś dostać
`przed środek
po w macierzystym
przmnym po w macierzystym

po w potomed środek

po w potonymwszystkie te procesy korzystają z tej samej funkcjiprintf(+ z tego samego bufora) ** równolegle **. Nie jest tothread-safe`, więc różne cuda mogą się dziać jeśli się przed tym nie zabezpieczysz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1