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 sizeof(chld_1_recv).

InformationsquelleAutor David | 2011-07-29

Schreibe einen Kommentar