Wie nutzt man die wait () - Funktion, wenn die Verzweigung mehrere Prozesse?
Lernen die Verwendung der fork () - Befehl und wie zum weiterleiten von Daten zwischen einem übergeordneten und es sind Kinder. Ich bin derzeit versucht, zu schreiben ein einfaches Programm, um zu testen, wie die Gabel und die pipe funktioniert. Mein problem scheint zu sein, die richtige Verwendung/Platzierung der wait-Funktion. Ich will, dass die Eltern warten, bis seine beiden Kinder abgeschlossen. Hier ist der code, den ich bisher:
int main(void)
{
int n, fd1[2], fd2[2];
pid_t pid;
char line[100];
if (pipe(fd1) < 0 || pipe(fd2) < 0)
{
printf("Pipe error\n");
return 1;
}
//create the first child
pid = fork();
if (pid < 0)
printf("Fork Error\n");
else if (pid == 0) //child segment
{
close(fd1[1]); //close write end
read(fd1[0], line, 17); //read from pipe
printf("Child reads the message: %s", line);
return 0;
}
else //parent segment
{
close(fd1[0]); //close read end
write(fd1[1], "\nHello 1st World\n", 17); //write to pipe
//fork a second child
pid = fork();
if (pid < 0 )
printf("Fork Error\n");
else if (pid == 0) //child gets return value 0 and executes this block
//this code is processed by the child process only
{
close(fd2[1]); //close write end
read(fd2[0], line, 17); //read from pipe
printf("\nChild reads the message: %s", line);
}
else
{
close(fd2[0]); //close read end
write(fd2[1], "\nHello 2nd World\n", 17); //write to pipe
if (wait(0) != pid)
printf("Wait error\n");
}
if (wait(0) != pid)
printf("Wait error\n");
}
//code executed by both parent and child
return 0;
} //end main
Derzeit meine Ausgabe sieht etwas entlang der Linien von:
./fork2
Child reads the message: Hello 1st World
Wait error
Child reads the message: Hello 2nd World
Wait error
Wo ist der geeignete Ort, um die Eltern warten?
Dank,
Tomek
- Hallo, ich mache ein Projekt, das sich derzeit durch Rohre. Könnten Sie erklären, wie die wichtigsten ist die Weitergabe von Informationen zu Ihrem ersten Kind-Prozess, wenn es in der letzten else-Anweisung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint meist ok (ich wusste nicht, es laufen, wohlgemerkt). Dein logischer Fehler liegt in der Annahme, dass die Kinder am Ende in einigen bestimmten Reihenfolge; nicht die Ergebnisse der
wait(0)
gegen eine bestimmte pid, es sei denn, Sie sind sicher, dass Sie wissen, was man du gehst wieder zurück zu bekommen!Edit:
Lief ich Ihr Programm; Sie haben mindestens einen Fehler, Ihr zweites Kind-Prozess ruft
wait()
, die Sie wahrscheinlich nicht wollen, zu tun. Ich empfehle, brechen einige von code in Funktionen, so können Sie mehr klar sehen, die Reihenfolge der Operationen, die Sie gerade ausführen, ohne all die Unordnung.waitpid()
.waitpid()
Felsen.ich denke, es ist besser, etwas zu verwenden, um zu warten, bis alle Kinder.
while
- Anweisung geht. Nach all den Gabeln? Nach jeder Gabel? Auch, nicht nur die Eltern haben, dies auszuführen?