2016-05-20 25 views
0

Ich versuche das fork() Konzept zu verstehen und es gibt eine Sache, die ich nicht zu verstehen verstehe.fork() und lokale Variablen ändern?

Im folgenden Code - warum druckt das Elternteil immer noch i = 0, auch wenn Kindprozess ändert es auf 5?

Die warten (NULL) blockiert übergeordneten Prozess, bis Kind zuerst beendet.

int main(int argc, char *argv[]) { 
    int i = 0; 
    if (fork() == 0) { 
    i = 5; 
    } else { 
    wait(NULL); 
    printf("i = %d\n", i); 
    } 
    return 0; 
} 

Kann jemand erklären, warum meine Annahme falsch ist?

+0

Was stellen Sie sich vor 'Gabel' tut? –

Antwort

5

Variablen werden nicht zwischen Prozessen aufgeteilt. Nach dem Aufruf an fork gibt es zwei völlig getrennte Prozesse. fork gibt 0 im untergeordneten Element zurück, wobei die lokale Variable auf 5 gesetzt ist. Im übergeordneten Element, wobei fork die Prozess-ID des untergeordneten Elements zurückgibt, wird der Wert i nicht geändert. Es hat immer noch den Wert 0 gesetzt, bevor fork aufgerufen wurde. Es ist das gleiche Verhalten, als ob Sie zwei Programme hatten laufen getrennt:

int main(int args, char *argv[]) { 
    int i=0; 
    printf("i = %d\n", i); 
    return 0; 
} 

und

int main(int argc, char *argv[]) { 
    int i = 0; 
    i = 5; 
    return 0; 
} 
+0

Also, wenn ich wollte, dass ich = 5 zu drucken, wenn der Elternteil ausgeführt wird, wie genau konnte ich das tun, ohne die Anweisung i = 5 im Eltern? Kurz gesagt, gibt es eine Möglichkeit, Variablen zwischen Kind und Eltern zu teilen? – RandomMath

+0

Sie müssen den Wert zu/von dem Kind übergeben, indem Sie einen IPC (Inter-Process Communication) -Mechanismus verwenden (Datei, Pipe, Socket, Shared Memory, ...) – AhmadWabbi

+0

Ähnliches Thema haben Sie [hier] (http: // stackoverflow.com/questions/10684499/sharing-same-variable-between-more-than-one-inde-pendent-programs-in-linux). Sie müssen jedoch über Inter Process Communication (IPC) lesen. –

1

Wenn Sie das Kind Prozess fork eine Kopie des Adressraums des Mutteradressraum bekommt, sie don‘ t teilen Sie es, wenn das Kind i geändert hat, wird das Elternteil es nicht sehen.

Dieses Kopieren des Adressraums wird normalerweise mit copy on write durchgeführt, um die Zuweisung von Speicher zu vermeiden, der sich niemals ändert.

4

Prozesse sind keine Threads! Wenn Sie forkieren, erstellen Sie einen vollständigen geklonten Prozess mit unabhängiger Speicherzuordnung, die einfach die gleichen Werte enthält (mit Ausnahme des Ergebnisses des Fork-Aufrufs) zum Zeitpunkt der Verzweigung.

Wenn ein Kind einige Daten im übergeordneten Prozess aktualisieren soll, müssen Sie einen Thread verwenden. Ein Thread teilt den gesamten statischen und dynamischen zugewiesenen Speicher mit seinem übergeordneten Element und verfügt lediglich über unabhängige automatische Variablen. Aber selbst dort sollten Sie statische Zuweisung für i Variable verwenden:

int i = 0; 
int main(int argc, char *argv[]) { 
    ...