2012-11-28 30 views
5
int x=0; 
int main() 
{ 
    for(i=0;i<2;i++) 
    { 
    fork(); 
    x=x+5; 
    } 
    return 0; 
} 

diagramJak rozwiązać ten fork() Przykład w C

Jestem nowicjuszem do koncepcji fork(). Czy powyższe drzewo (z wartościami x) jest poprawnym rozwiązaniem dla kodu C wspomnianego powyżej? Wartości w węzłach to odpowiednio wartości ich procesów.

A także czy możemy zwrócić wartości do procesu nadrzędnego z procesu potomnego? Załóżmy, że w powyższym przykładzie kod mogę zwrócić wartość x dziecka do procesu nadrzędnego?

+1

To nawet nie skompilować. – geoffspear

+1

Nie jest całkiem jasne, co oznacza twój wykres, ale zakładając (ukierunkowane) krawędzie reprezentują relacje między rodzicem a dzieckiem, a korzeń jest procesem pierwotnym, to 5 powinno być 10, ponieważ każdy z 4 procesów kończy się zwiększaniem x o 5 razy dwukrotnie . W każdym razie, co dokładnie próbujesz zrobić? – Celada

+0

yes.Król na diagramie reprezentuje początkowy proces początkowy, a skierowane krawędzie pokazują relację rodzic-dziecko. Wszystko, co chcę wiedzieć, to: W sumie, ile formuje się węzłów i czy wartości x w odpowiednich węzłach są poprawne lub nie dzięki. – starkk92

Odpowiedz

6

To znaczy, że to drzewo proces i pęcherzyków to jest wartość x? Wtedy nie, to nie jest poprawne.

Po zrodzeniu dziecka otrzymuje dokładną kopię rodzica ...więc niech „print” pewne wartości, dzięki czemu możemy zobaczyć stan rzeczy (jestem makeing się PID za wszystko)

Kiedy zaczynamy, to tylko rodzic:

parent (11174) x = 0, i = 0 

Potem trafiliśmy fork() teraz mamy dwa procesy:

+--parent (11174) x = 0, i = 0 
| 
+->child1 (11175) x = 0, i = 0 

Następny matematyka:

parent (11174) x = 5, i = 0 

child1 (11175) x = 5, i = 0 

Wh pl pętli z powrotem w górę, nasze I będzie zwiększany, a każdy proces prowadzi teraz pętlę i uderza fork():

+--parent (11174) x = 5, i = 1 
| 
+->child2 (11176) x = 5, i = 1 

+--child1 (11175) x = 5, i = 1 
| 
+->child (11177) x = 5, i = 1 

Teraz każdy uderza matematyki jeszcze:

parent (11174) x = 10, i = 1 

child2 (11176) x = 10, i = 1 

child1 (11175) x = 10, i = 1 

child (11177) x = 10, i = 1 

Wreszcie każdy natrafi pętlę i inkrementacja i zerwanie z nim. Więc wynik końcowy jest:

parent (10)----->child1(10)---->child(10) 
      | 
      +----->child2(10) 
+0

świetne wyjaśnienie. Teraz wyraźnie rozumiem, jak rozwiązać te problemy. Dziękujemy :) – starkk92

+1

@ user1632141 - chętnie pomożemy! Przydaje się zapisywanie kroków, aby można było zobaczyć, że działa, jeśli nie możesz tego zrobić w głowie, skompiluj swój mały przykładowy kod i dodaj kilka printfów, takich jak: 'printf (" process% d: x =% d , i =% d \ n ", getpid(), x, i);" byłoby dobrym miejscem do rozpoczęcia! – Mike

+0

zdobyli to .. dzięki .. – starkk92

6

Jeśli zadzwonisz fork() następnie kod poniżej jest dla obu procesów tj parent i child.

fork tworzy nowy proces (znany jako dziecko), którego przestrzeń adresowa jest inna niż proces nadrzędny. Więc nic nie jest dzielone między nimi.

Wywołujesz widełki w pętli, Właściwie 2 razy, więc będzie całkowity 4 niezależny proces.

Jeśli chcesz zrobić oddzielnego kodowania w procesie potomnym zawsze używać zwracanych wartości fork() tak:

if(!fork()) 
{ 
// child process 
} 
else 
{ 
// parent process 
} 

przypadku pytań tak:

And also can we return values to the parent process from the child process? 
    Suppose lets say in the above example code can I return the x value of the 
    child to the parent process? 

Odpowiedź jest, można nie zwraca bezpośrednio wartości z jednego procesu do drugiego. Komunikacja między 2 lub więcej procesami odbywa się za pomocą koncepcji o nazwie Inter proces commmunicaton (IPC), którą można wykonać na dwa sposoby.

1. shared memory 
2. memssage passing (pipe, rpc) 

Ponadto istnieje wiele wiele rzeczy trzeba będzie zrozumieć przed rozwiązywaniu tego problemu. Specjalnie kiedy próbuje zrobić to za pomocą fork a także chcą powrócić wartości

Powinieneś zobaczyć this

Albo, może to pomóc more

+0

yes.it does help.thanks :) – starkk92

+1

W każdej chwili, ale pamiętaj, że rozwiązanie tego jednego problemu nie pomoże ci zbyt wiele, spróbuj zrozumieć koncepcję za widelcem lub jakikolwiek proces tworzenia i komunikacji – Omkant

+0

Poprawnie. Ma sens teraz dla mnie .. – starkk92

2
fork(); 

tworzy proces potomny i kopiuje wszystkie zmienne do zmiennych rodzica dziecka.

nadrzędny:

Twój główny program utworzyć 2 dzieci, jak wspomniano w pętli for, gdy tworzy child1, wartość jest i jest 0 gdy tworzy child2 wartość jest i jest 1

child1:

Child1 rozpocząć jego wykonanie po fork(), i++ wykonywany w następnej iteracji (i = 1) - Stan prawdziwe (1 < 2), Child1 rozwidlony kolejne dziecko, które jest child3, w child3 wartość i jest 1.

Child2 i Child3:

Child2 i Child3 rozpocząć jego wykonanie z i = 1 po fork(), i++ wykonany, teraz i staje 2, stan fałszywy, dalsze dziecko jest tworzony.

3 procesy utworzone w sumie.

KOD:

int x=0; 
int main() 
{ 
    for(i=0;i<2;i++) 
    { 
    fork(); 
    x=x+5; 
    } 
    printf("x = %d\n", x); 
return 0; 
} 

WYJŚCIE:

x = 10 
x = 10 
x = 10 
x = 10 
Powiązane problemy