2010-11-27 12 views
1

Ich habe untersucht, dass während einer Gabelung das Daten- und Code-Segment des Elternprozesses in den Kindprozess dupliziert wird.Segmente, die während fork() dupliziert wurden?

Bitte sehen Sie das Programm unten.

int main() 
{ 
    int a = 5; 
    pid_t pid; 

    pid = fork(); 

    if(pid == 0) 
    { 
     printf("In child a = %d",a); 
    } 

    else 
    { 
    printf("In parent a = %d",a); 
    } 

    return 0; 
} 

Hier ist ein in dem Stapel-Segment des Eltern-Prozess, wie es in der Funktion erklärt wird, main(). Der untergeordnete Prozess sollte während fork() nur Kopie des Codes und des Datensegments des übergeordneten Prozesses und nicht des Stapels abrufen. Aber wenn ich das Programm ausführe, kann ich sehen, dass der Kindprozess auch auf die Variable "a" zugreifen kann. Das bedeutet, dass der Stapel des übergeordneten Prozesses auch in den untergeordneten Prozess kopiert wird.

Bitte sagen Sie mir den Grund dafür und korrigieren Sie mich, wenn mein Verständnis falsch ist.

Antwort

2

Sie sollten die docs erneut überprüfen. fork erstellt eine "exakte Kopie des aufrufenden Prozesses". Zugegeben, es gibt viele Ausnahmen, aber der Stack gehört nicht dazu.

Auch wenn der Stapel nicht dupliziert wurde, würde das sehr häufige Idiom (auch in Ihrem Code verwendet) des Überprüfens des Rückgabewerts (fast immer eine Stapelvariable) von fork fehlschlagen. Es würde keine Stapelposition für pid sein, außer der Stapel (einschließlich Stapelzeiger) wurde dupliziert.

+0

was also sollte ich verstehen ist das, dass alle Datensegmente: Stapel, Heap, Code und Datensegmente in das Kind vom Elternteil während fork() dupliziert werden? –

+0

Ja. Alles wird dupliziert, es sei denn, es wird als Ausnahme ausgegeben. –

+0

Danke Matthew :) –

2

Das ist kein guter Test - wie Matthew schon erwähnt hat, gibt fork() eine exakte Kopie des Elternprozesses, einschließlich des Stacks (sonst könnte das Kind nicht von dieser Funktion zurückkehren).

Ein besserer Test ist zu ändern 'a' in der Eltern und beobachten sie in das Kind, wie folgt aus:

#include <stdio.h> 
#include <unistd.h> 
int main() 
{ 
    int a = 5; 
    pid_t pid; 

    pid = fork(); 

    if (pid == 0) 
    { 
     sleep(5); 
     printf("In child a = %d\n",a); 
    } 
    else 
    { 
     a++; 
     printf("In parent a = %d\n",a); 
    } 

    return 0; 
} 

und das Ergebnis korrekt ist:

pandora:~/tmp$ cc -o x x.c 
pandora:~/tmp$ ./x 
In parent a = 6 
pandora:~/tmp$ In child a = 5 
+0

Ja, ich kenne das Konzept, über das du redest. Obwohl die Segmente des übergeordneten Elements in das untergeordnete Element dupliziert werden, sind ihre Segmente unabhängig, da zwei Prozesse ihren eigenen Adressraum haben. Also ich verstehe, was Sie versuchen, mit dem gegebenen Beispiel zu sagen. Danke. –