2016-07-04 38 views
0

Ich habe diese Art der Kommunikation zwischen 3 Prozesse zu schaffen:erstellen 2 Kind-Prozesse

  • 1 Verfahren (Eltern):

    • sendet gerade Zahlen Kind 1;
    • sendet ungerade Zahlen an Kind 2;
    • erhalten Zahlen von Kind 1 und Kind 2
  • 2 Verfahren (Kind 1) gesendet:

    • bekommt gerade Zahlen von Elternteil;
    • sendet gerade Zahlen an Kind 2;
    • sendet 2 * value_of_number Mutter
  • 3 Verfahren (Kind 2):

    • ungeradzahlige Anzahlen von Elternteil erhält;
    • sendet 2 * value_of_number Mutter

Dies ist mein Code:

int main() 
{ 
    int p12[2],p13[2],p23[2]; 
    int p21[2],p31[2]; 

    if(pipe(p12)<0){ 
     perror("pipe 12 error\n"); 
     exit(1); 
    } 

    if(pipe(p13)<0){ 
     perror("pipe 13 error\n"); 
     exit(1); 
    } 

    if(pipe(p23)<0){ 
     perror("pipe 23 error\n"); 
     exit(1); 
    } 

    if(pipe(p21)<0){ 
     perror("pipe 21 error\n"); 
     exit(1); 
    } 

    if(pipe(p31)<0){ 
     perror("pipe 31 error\n"); 
     exit(1); 
    } 

    switch(fork()){ 
     case -1:{ 
      perror("fork 1 error\n"); 
      exit(1); 
     } 
     case 0:{//1 child 
      close(p12[1]); 
      close(p13[1]); 
      close(p13[0]); 
      close(p23[0]); 
      close(p21[0]); 
      close(p31[1]); 
      close(p31[0]); 
      int paros; 
      int ket; 
      while(read(p12[0],&paros,sizeof(int))>0){ 
       cout<<"2: "<<paros<<endl; 
       if(write(p23[1],&paros,sizeof(int))==-1){ 
        perror("write 23 error\n"); 
        exit(1); 
       } 
       ket=2*paros; 
       if(write(p21[1],&ket,sizeof(int))==-1){ 
        perror("write 21 error\n"); 
        exit(1); 
       } 
      } 
      close(p21[1]); 
      close(p12[0]); 
      close(p23[1]); 
      exit(0); 
     } 
     default:{ 
      switch(fork()){ 
       case -1:{ 
        perror("fork 2 error\n"); 
        exit(1); 
       } 
       case 0:{//2 child 
        close(p13[1]); 
        close(p12[1]); 
        close(p12[0]); 
        close(p23[1]); 
        close(p31[0]); 
        close(p21[1]); 
        close(p21[0]); 
        int szamok; 
        int ket; 
        while(read(p13[0],&szamok,sizeof(int))>0){ 
         cout<<"3: "<<szamok<<endl; 
         ket=2*szamok; 
         if(write(p31[1],&ket,sizeof(int))==-1){ 
          perror("write 31 error\n"); 
          exit(1); 
         } 
        } 
        while(read(p23[0],&szamok,sizeof(int))>0){ 
         cout<<"3: "<<szamok<<endl; 
        } 
        close(p31[1]); 
        close(p13[0]); 
        close(p23[0]); 
        exit(0); 
       } 
       default:{ 
        close(p12[0]); 
        close(p13[0]); 
        close(p23[0]); 
        close(p23[1]); 
        close(p21[1]); 
        close(p31[1]); 
       } 
      } 
     } 
    } 
    int i=1; 
    while(i<=10){ 
     if(i%2==0){ 
      if(write(p12[1],&i,sizeof(int))==-1){ 
       perror("write 12 error\n"); 
       exit(1); 
      } 
     } 
     else{ 
      if(write(p13[1],&i,sizeof(int))==-1){ 
       perror("write 13 error\n"); 
       exit(1); 
      } 
     } 
     i++; 
    } 
    int szam; 
    while(read(p21[0],&szam,sizeof(int))>0){ 
     cout<<"1: "<<szam<<endl; 
    } 
    while(read(p31[0],&szam,sizeof(int))>0){ 
     cout<<"1: "<<szam<<endl; 
    } 
    close(p12[1]); 
    close(p13[1]); 
    close(p31[0]); 
    close(p21[0]); 
    while(wait(NULL)>0){}; 
    exit(0); 
} 

Aber aus irgendeinem Grund ist es nicht funktioniert ...

+0

läuft Was das Problem, das Sie ist erhalten: welches Verhalten Sie haben nicht erwartet, und welches Verhalten bekommst du wirklich? – Garf365

Antwort

0

Ihre Eltern schreibt 5 Zahlen in jede Pipe warten dann auf alle Antworten von Kind 1, bevor Sie mit Kind 2 fortfahren. Nachdem Sie Zahlen in die Kinder geschrieben haben, schließen Sie diese nicht, sodass diese Kinder nicht wissen, dass das Elternteil s hat gekrönt. Im Fall von Kind 1 wartet es immer noch auf weitere Nummern vom Elternteil. Aus diesem Grund wird es nie seine eigenen Rohre schließen und verlassen. Der Elternteil bleibt daher in der ersten Leseschleife von Kind 1 stecken und gelangt nie zu Kind Zwei.

Nach in p12 Schreiben [1] und p13 [1], fügen

close(p12[1]); 
close(p13[1]); 

und der Prozess wird bis zur Fertigstellung