2017-09-16 1 views
-2

Ich bin ein bisschen verwirrt über den Wert, den die Funktion Gabel zurückgibt. Ich verstehe, dass der Wert 0 für child Prozess und Wert >0 für parent Prozess ist. Ich habe den Code untenSpeichern des Rückgabewerts von fork in einer Variablen in C

int main() 
{  
    int pid; 
    pid = fork(); 
    if(pid == 0) 
     //DO SOMETHING 
    else 
     //DO SOMETHING ELSE 
    return 0; 
} 

Die valiable pid nach Gabel für jeden Prozess unterschiedlich ist? Ich kann nicht verstehen, wie es den Wert wechselt. Und ich habe einen zweiten Teil mit Code

int main() 
{ 
    int pid; 
    if (pid == 0) 
    { 
      return 5; 
    } 
    printf("parent = %d waits for child = %d ", getpid(), pid); 
    waitpid(pid, NULL, 0); 
    printf("child terminates!") 
    return 0; 
} 

, in dem ich nicht verstehen, warum pid auf Linie mit dem ersten printf den Wert des Kindes hat. Es sollte nicht die id des Elternteils sein?

Antwort

0

Die valide Pid nach Gabel ist für jeden Prozess anders?

Ja, das ist die neue Prozess-ID, die Sie als Rückgabewert erhalten. Es kann nicht die gleichen Prozesse mit der gleichen ID zur gleichen Zeit geben. Wenn Sie also forkieren, erhalten Sie in der Regel eine eindeutige ID.

Der Prozess wird während des Aufrufs fork() geklont, einschließlich Kopien aller variablen Speicherinhalte (Heap, Stack, Datensegmente). Sobald die Kopie abgeschlossen ist, nimmt der Kernel die Ausführung beider Prozesse wieder auf, gibt jedoch unterschiedliche Rückgabewerte zurück.

in denen ich nicht verstehen kann, warum pid on line mit ersten printf hat den Wert von Kind. Es sollte nicht die ID von Eltern sein?

getpid() gibt die ID des übergeordneten Elements zurück, da dies der Kontext ist, in dem Sie es jetzt ausführen. pid ist einfach Müll (nicht initialisierter Speicher) in diesem Beispiel, also was auch immer Sie denken, Sie sehen, es ist keine Prozess-ID, sondern nur einige zufällige Speicherinhalt.

+0

In der zweiten Frage sagen Sie, dass 'pid' es keine Prozess-ID ist. Aber der Elternteil verwendet waitpid(), um auf den Kindprozess zu warten, und wartet. Warum ist es keine Prozess-ID? –

+0

@DimitrisMpl Dies ist eine dem Stack zugeordnete Integer-Variable, die überhaupt nicht initialisiert wurde. Es ist NICHT die gleiche 'pid' Variable, die Sie in der anderen Funktion verwendet haben, trotz des gleichen Namens. Es enthält also nur das, was zuletzt auf dem Stapel an diesem Ort geschrieben wurde. – Ext3h

Verwandte Themen