2016-07-06 21 views
0

Was ich getan habe, ist, ich schuf n Kinder und als der Elternteil die Nachricht "Start" zu ihnen mit n Rohren. Eine Pipe für jedes Kind. Nun, was ich zu tun habe, ist es, dem Elternteil die Nummer jedes Kindes zurückzugeben.N Kinder Nachricht an Eltern senden

Dies ist mein Code bis jetzt:

int main() 
{ 
int n=5; 

int p[n-1][2]; 

int i; 
for(i=0;i<n;i++){ 
    if(pipe(p[i])>0){ 
     perror("pipe error"); 
     exit(1); 
    } 
} 

for(i=0;i<n;i++){ 
    pid_t pid=fork(); 
    if(pid<0){ 
     perror("fork error"); 
     exit(1); 
    } 
    if(pid==0){ 
     int j; 
     for(j=0;j<n;j++){ 
      close(p[j][1]); 
     } 
     for(j=0;j<i;j++){ 
      close(p[j][0]); 
     } 
     char msg[256]; 
     int h; 
     read(p[i][0],&h,sizeof(int)); 
     read(p[i][0],msg,h*sizeof(char)); 
     cout<<i<<"_"<<msg<<endl; 
     close(p[i][0]);//here I would like to send the number i to the parent 
     for(j=i+1;j<n;j++){ 
      close(p[j][0]); 
     } 
     exit(0); 
    } 
} 

char ms[256]; 
strcpy(ms,"start"); 
int ho=strlen(ms); 
for(i=0;i<n;i++){ 
    if(write(p[i][1],&ho,sizeof(int))==-1){ 
     perror("write error"); 
     exit(1); 
    } 
    if(write(p[i][1],ms,ho*sizeof(ms))==-1){ 
     perror("write error"); 
     exit(1); 
    } 
    close(p[i][1]); 
} 
for(int j=0;j<n;j++) 
    close(p[j][0]);//then read the number of each child and print it 
while(wait(NULL)>0){}; 
exit(0); 

}

Und dies ist die Ausgabe:

0_start 
    2_start 
    1_start 
    4_start 
    3_start 

So erfolgreich ich die Meldung Start kann ich zu jedem child.But geschickt Finde nicht heraus, wie die Eltern die von den Kindern geschickten Nummern erhalten werden.

+1

Das Array p hat die Größe n. Also sollten Sie in 'p [0]' bis 'p [n-1]' schreiben. Sie schreiben in 'p [1]' bis 'p [n]'. –

+0

Ändern Sie Ihre for-Schleifen zu 'für (int j = 0; j

+0

okay, ich werde das bearbeiten –

Antwort

0

Sie können einen ähnlichen Prozess durchführen Aber hier hat das Elternteil das Leseende der Pipe und die Kinder das Schreibende. Erweitert das obige Beispiel um nur eine Pipe. Sie könnten mehrere Pipes für jedes Kind haben.

int main() 
{ 
int n=5; 

int p[n-1][2]; 
int pw[2]; // pipe child writes into 

int i; 
for(i=0;i<n;i++){ 
    if(pipe(p[i])>0){ 
     perror("pipe error"); 
     exit(1); 
    } 
} 
    if(pipe(pw)>0){ 
     perror("pipe error"); 
     exit(1); 
    } 

for(i=0;i<n;i++){ 
    pid_t pid=fork(); 
    if(pid<0){ 
     perror("fork error"); 
     exit(1); 
    } 
    if(pid==0){ 
     int j; 
     for(j=0;j<n;j++){ 
      close(p[j][1]); 
     } 
     close(pw[0]);// close read end - child 
     for(j=0;j<n;j++){ 
      if (i!= j) close(p[j][0]); 
     } 
     char msg[256]; 
     int h; 
     read(p[i][0],&h,sizeof(int)); 
     read(p[i][0],msg,h*sizeof(char)); 
     cout<<i<<"_"<<msg<<endl; 
     close(p[i][0]);//here I would like to send the number i to the parent 
     write(pw[1],&i,sizeof(int)); // send i 
     close(pw[1]); 
     exit(0); 
    } 
} 

char ms[256]; 
strcpy(ms,"start"); 
int ho=strlen(ms); 
int value; 
for(i=0;i<n;i++){ 
    if(write(p[i][1],&ho,sizeof(int))==-1){ 
     perror("write error"); 
     exit(1); 
    } 
    if(write(p[i][1],ms,ho*sizeof(ms))==-1){ 
     perror("write error"); 
     exit(1); 
    } 
    close(p[i][1]); 
    close(pw[1]); //close write end 
    if(read(pw[0],&value,sizeof(int))==-1){ // read from child process 
     perror("write error"); 
     exit(1); 
    } 
    cout << " in main "<<value<<endl; // display number 
} 
for(int j=0;j<n;j++) 
    close(p[j][0]);//then read the number of each child and print it 
while(wait(NULL) > 0){;} 
exit(0); 
}