2016-04-21 11 views
-4

Ich habe diesen Code, einen Code in Abhängigkeit davon, ob der aktive Prozess ist die Eltern oder das Kind Prozess in einer Endlosschleife ausführt:Warum funktioniert dieser Code mit fork()?

pid_t childPID; 

childPID=fork(); 

while (1) 
{ 
    if (childPID >=0) 
    { 
     if (childPID==0) 
     { 
      [do child process stuff] 
     } 
     else 
     { 
      [do parent process stuff] 
     } 
    } 
    else 
    { 
     printf("\n Fork failed, quitting!!!!!\n"); 
     return 1; 
    } 
} 

-Code ist einfach, aber es gibt eine sehr große Sache für mich auf sie die Ich verstehe nicht, wie es passiert, obwohl ich eine Vermutung habe:

Wenn wir nicht in Betracht ziehen, dass wir 2 Prozesse erstellen, sieht es so aus, als ob ChildPid ständig neu definiert wird, was ich nicht für sinnvoll halte.

Also meine Vermutung ist, dass Fork eine childPid für jeden Prozess erstellt, eine 0 an den übergeordneten Prozess und die PID an den Kindprozess zurück, obwohl diese Syntax mich denken, dass es nur ein Ergebnis zurückgeben und zuweisen sollte zu chilPid.

Ist meine Vermutung richtig oder gibt es noch etwas anderes?

Vielen Dank.

+0

erstellt Wie 'do [tun Mutter Sachen] 'und' [tun Kind Zeug] 'Ende? Verlässt einer von ihnen das Programm? – fuz

+2

'man fork', Rückgabewert:" Bei Erfolg wird die PID des untergeordneten Prozesses im übergeordneten Element zurückgegeben, und 0 wird im untergeordneten Element zurückgegeben. Bei einem Fehler wird -1 im übergeordneten Element zurückgegeben, kein untergeordneter Prozess wird erstellt. und errno wird entsprechend gesetzt. " – keltar

+2

" wird ständig neu zugewiesen "- Ich sehe nur eine Zuweisung zu' childPid' in diesem Code und seine * nicht * in einer while-Schleife – WhozCraig

Antwort

1

Von fork(2) linux man page:

Bei Erfolg wird die PID des Kindes Prozess wird in der Mutter zurückgekehrt, und 0 wird in das Kind zurück. Bei einem Fehler wird -1 in den Eltern zurückgegeben, wird kein Kind-Prozess erstellt und errno gesetzt entsprechend

So ist childPID 0 im Kind-Prozess und ist pid des Kindes im Eltern Prozess

2

So Meine Vermutung ist, dass Fork ein childPid für jeden Prozess erstellt, eine 0 an den Elternprozess und die PID an den Kindprozess zurücksendet, obwohl diese Syntax mich denken lässt, dass es nur ein Ergebnis zurückgeben und es chilPid zuweisen sollte.

Genau das. Von der Gabel Referenzhandbuch:

UCKGABEWERT: Bei Erfolg wird der PID des Child-Prozesses in der Mutter zurückgegeben und 0 in dem Kind zurück. Bei einem Fehler wird -1 im übergeordneten Objekt zurückgegeben, kein untergeordneter Prozess erstellt und errno wird entsprechend festgelegt.

so

Ist meine Vermutung

Warum denken, wenn dies gerade in der POSIX-Spezifikation definiert ist?

+0

Ich hatte das gelesen, aber wie ich den Code sehe ich denke, dass seine Rückkehr bedeutet nicht, dass es eine Variable im ersten Prozess definiert, aus meiner Sicht könnte diese Beschreibung auch 2 neue Variablen erstellen, die zugegriffen werden könnte mit einer Syntax wie [parent_process] .childPID oder [chil_process] .childPid, so dass Sie bei Bedarf immer auf jedes verweisen können und nicht nur auf childPid zugreifen können, ohne vorher zu wissen, ob es sich auf den Eltern- oder Kindprozess bezieht. – user2638180

+0

@ user2638180: Nach einer erfolgreichen "Gabelung" gibt es eine nahezu perfekte Kopie des ursprünglichen Prozesses, und sowohl Eltern als auch Kind sind im selben Zustand. Aber ihre Erinnerungsbilder sind andere. Wenn eine Rückgabe eines PID-Paares erfolgt, wäre es für beide Prozesse unmöglich zu sagen, ob es sich um Eltern oder Kinder handelt. Daher ist eine leichte, aber signifikante Asymmetrie erforderlich. Und dies wird implementiert, indem verschiedene Werte an Eltern und Kind zurückgegeben werden. Ein Prozess kann seine PID mit "getpid()" abfragen, so dass das Kind ein 'fork()' zurückgibt und das übergeordnete Element die untergeordnete PID. Dies führt zu der erforderlichen Asymmetrie. – datenwolf

1

Was fork tut, ist eine neue Kopie des tatsächlichen Prozesses als Kindprozess zu erstellen.

Die childPID=fork(); wird in beiden Prozessen ausgewertet und gibt nur einen einzigen Wert zurück, der Trick ist, dass der Wert unterschiedlich ist, je nachdem, welcher Prozess ausgeführt wird.Auf dem übergeordneten Prozess gibt sie die PID des neuen Prozesses (Kind), und auf das Kind Prozess kehrt 0, wenn fork war nicht erfolgreich zurückkehrt -1 adn das Kind Prozess wird nie