PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines Problem mit fork()



ContainerDriver
27-06-2003, 10:45
Hallo,
ich habe ein kleines Problem mit fork().
Hier ist ein Ausschnitt aus dem Prog:

//----------------------------------
pid_t one=getpid();
pid_t two=fork();
pid_t three=0;

if (getpid()==one) //dieser Aufruf funktioniert
{
three=fork();
cout << "1: Hallo" << endl;
}

if (getpid()==two) //erscheint _nicht_
{
cout << "2: Hallo" << endl;
}

if (getpid()==three) //erscheint
{
cout << "3: Hallo" << endl;
}

//-----------------------------------

Also, ich will 3 Prozesse haben, jeder soll "Hallo" ausgeben. 1 und 3 geben es aus, 2 nicht. Warum nicht?

Vielen Dank für die Antwort

MFG Florian

almoeli
27-06-2003, 13:56
Hi,

folgender Fehler in deinem Programm:

fork liefert als Rückgabewert die PID an den Vaterprozess. Der Sohnprozess bekommt als Rückgabewert aus dem fork eine 0.
Deshalb ergibt sich folgende Variablenbelegung:

Prozess 1:
one = pid von 1
two = pid von 2
three = pid von 3 (nach dem fork im 1 if)

Prozess 2:
one = pid von 1
two = 0
three = 0

Prozess 3:
one = pid von 1
two = pid von 2
three = 0

Deshalb gibt das Programm so wie du es gepostet hast zweimal '1: Hallo' aus. Eine Ausgabe stammt von Prozess 1 und eine von Prozess 3, der nach dem fork auch nochmal über diese Ausgabe drüber läuft. Der 2. und 3. if wird aufgrund der oben aufgeführten Variablenbelegung in den Sohnprozessen nie wahr werden und deshalb kommt auch keine Ausgabe.
Folgender Source würde das machen, was du wahrscheinlich tun möchtest.

/*------------------------------------*/
pid_t one=getpid();
pid_t two=fork();
pid_t three=0;

if (getpid()==one) {
cout << "1: Hallo" << endl;
three=fork();
}

if (0==two) {
cout << "2: Hallo" << endl;
}

if (0==three && two != 0) {
cout << "3: Hallo" << endl;
}
/*------------------------------------*/

Ich empfehle dir allerdings, die Standard if Abfrage beim fork zu verwenden:

if ((pid = fork()) == 0)
{
/* Code Sohnprozess */
}
/* Code Vaterprozess */

So ist immer eindeutig klar, welcher Code in welchem Prozess läuft.

Gruß

almoeli