C fork behandelt globale Variable

8

Ich verstehe die Ausgabe dieses Programms nicht:

%Vor%

Die Ausgabe ist:

%Vor%

Kann mir bitte jemand sagen, wie ich dieses Problem angehen sollte, um vollständig zu verstehen, warum ich diese Ausgabe bekomme?

    
Bruno 28.01.2010, 22:13
quelle

5 Antworten

24

Fork erstellt eine Kopie des Prozesses. Eine unabhängige Kopie des Prozesses. Wenn also eine globale Variable zum Zeitpunkt der Verzweigung 3 enthält, erhält jede Kopie des Prozesses ihre eigene 3. Und wenn sie sich ändern, sind ihre Änderungen völlig unabhängig.

    
bmargulies 28.01.2010 22:15
quelle
16

Ändern Sie Ihren Code und die Ausgabe sollte viel mehr Sinn machen:

%Vor%     
Paul R 28.01.2010 22:22
quelle
5

Wenn Sie fork (), wird eine vollständige Kopie des aktuellen Prozesses in seinem aktuellen Zustand erstellt. Dies bedeutet, dass Ihr erster Prozess drei neue Prozesse erstellt, die sich in der Mitte der while-Schleife befinden, wobei i jeweils 0, 1 und 2 ist. Es wird auch seine eigenen Werte von i ausgeben.

Jedes seiner untergeordneten Elemente setzt die Schleife vom fork() -Aufruf fort, indem es seinen ursprünglichen i -Wert ausgibt, inkrementiert und schleift. Dies bedeutet, dass Kinder 0 0, 1 und 2 drucken und zwei neue Kinder mit "anfänglichen" Werten von i 1 und 2 spawnen. Kinder 1 werden 1 und 2 drucken und ein weiteres Kind mit einem "Initial" spawnen "Wert von i von 2. Kinder 2 werden 2 drucken und die Schleife verlassen.

Wenn Sie diese Argumentation fortsetzen, werden Sie zu der Schlussfolgerung kommen, dass insgesamt zwei 0, vier 1 und acht 2 gedruckt werden. Da die Reihenfolge der Ausführung jedoch davon abhängt, wie das Betriebssystem die konkurrierenden Prozesse plant, können Sie keine Garantien für die Reihenfolge geben, in der diese gedruckt werden.

    
R. Martinho Fernandes 28.01.2010 22:20
quelle
3

Verwenden Sie pthreads, wenn Sie einen Thread innerhalb des Prozesses für die gleichzeitige Programmierung erstellen möchten. Die gewünschte Funktion ist pthread_create und pthread_join zum späteren Aufräumen.

In etwa so:

%Vor%

Aber vielleicht nicht, abhängig von Ihren tatsächlichen Bedürfnissen.

    
user257111 28.01.2010 22:19
quelle
2

Es ist so etwas wie ...

%Vor%

... usw.

Die Reihenfolge, in der die Prozesse ausgegeben werden, ist jedoch unbestimmt, so dass Sie wahrscheinlich nicht jedes Mal die exakt gleiche Ausgabe sehen, und selbst wenn Sie dies tun, können Sie das nicht garantieren.

Wie andere Leute sagten, hat jeder Prozess sein eigenes globales "i", das er verfolgt, und sein Wert ist einfach der Wert des Forking-Prozesses i an der Verzweigung.

    
Tanzelax 28.01.2010 23:10
quelle

Tags und Links