die Kommunikation zwischen zwei Kind-Prozesse mit pipes
Ich versuche, code zu schreiben, der spawnt zwei Kind-Prozesse senden sich gegenseitig eine Nachricht über eine Leitung dann kündigen. Allerdings, wenn ich den folgenden code ausführen, nur kind2 druckt es der Gruß aber Kind 1 noch druckt die Meldung es wird von Kind 2, wenn Kind 1 nicht.
Weiß jemand, was ist falsch mit meiner Methode?
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char** argv) {
char chld_1_send[20] = "hello from child 1";
char chld_1_recv[20];
char chld_2_send[20] = "hi from child 2";
char chld_2_recv[20];
int chld_1_outgoing[2];
int chld_2_outgoing[2];
pipe(chld_1_outgoing);
pipe(chld_2_outgoing);
int chld_1_status, chld_2_status;
pid_t chld_1, chld_2;
chld_1 = fork();
if(chld_1 == 0) {
chld_2 = fork();
}
if(chld_1 == 0 && chld_2 == 0) {
printf("parent [pid:%d] waiting on both children to finish\n", getpid());
while(wait(&chld_1_status) != chld_1 && wait(&chld_2_status) != chld_2) {}
printf("done waiting\n");
}
else if(chld_1 != 0 && chld_2 == 0) {
printf("this is child 1 [pid:%d] with parent [pid:%d]\n", getpid(), getppid());
write(chld_1_outgoing[1], chld_1_send, strlen(chld_1_send));
while(read(chld_1_outgoing[0], &chld_1_recv, sizeof(chld_2_recv)) < 0) {}
printf("child 2 said '%s'\n", chld_1_recv);
exit(0);
}
else if(chld_2 != 0 && chld_1 == 0) {
printf("this is child 2 [pid:%d] with parent [pid:%d]\n", getpid(), getppid());
write(chld_2_outgoing[1], chld_2_send, strlen(chld_2_send));
while(read(chld_2_outgoing[0], &chld_2_recv, sizeof(chld_2_recv)) < 0) {}
printf("child 1 said '%s'\n", chld_2_recv);
exit(0);
}
printf("both children have terminated successfully\n");
return 0;
}
Jedoch, läuft dieser Befehl druckt diese an das terminal und wechselt in einer Endlosschleife:
$ this is child 2 [pid:15713] with parent [pid:1]
child 1 said 'hi from child 2'
parent [pid:15714] waiting on both children to finish
developers.sun.com/solaris/articles/named_pipes.html
gibt es trotzdem, dies zu tun, ohne eine named pipe? Ich meine, ein Rohr ist immer noch in der Lage zu kommunizieren mit den anderen, nur nicht dem anderen Kind, das aus irgendeinem Grund.
Ich habe die waitpid-Aufrufe warten. Aber jetzt geht das Programm in eine Endlosschleife.
Ein paar Dinge: Ihre Kinder sind zu jeder Kommunikation mit sich selbst, nicht mit einander. Auch, obwohl Sie das gleiche zurückgeben, die erste while-Schleife verwenden sollte
gibt es trotzdem, dies zu tun, ohne eine named pipe? Ich meine, ein Rohr ist immer noch in der Lage zu kommunizieren mit den anderen, nur nicht dem anderen Kind, das aus irgendeinem Grund.
Ich habe die waitpid-Aufrufe warten. Aber jetzt geht das Programm in eine Endlosschleife.
Ein paar Dinge: Ihre Kinder sind zu jeder Kommunikation mit sich selbst, nicht mit einander. Auch, obwohl Sie das gleiche zurückgeben, die erste while-Schleife verwenden sollte
sizeof(chld_1_recv)
.
InformationsquelleAutor David | 2011-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgenden ist ein einfaches Beispiel, die sicherlich verbessert werden können, aber sollte Ihnen den Einstieg.
Auch Folgen Link1 und Link2 für mehr info.
InformationsquelleAutor celavek
Ihre Logik ist rückwärts für die Bestimmung, ob ein gegebener Prozess ist ein Elternteil oder ein Kind. Bekommt das Kind
0
ausfork
, und die Eltern bekommen das Kind pid. Vermutlich, Sie wollen beide Kinder die gleichen Eltern, in welchem Fall die ersteif
werden sollte:Und die Eltern sollten den Prozess, in dem sowohl
chld_1
undchld_2
sind ungleich null:Zusätzlich, sollten Sie die Fehler-checking beide
fork
s (Rückgabe von -1 bedeutet einen Fehler).InformationsquelleAutor Aaron Dufour