2017-05-22 2 views
-1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <signal.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <sys/sem.h> 
#include <sys/msg.h> 
#include <time.h> 
struct msgbuf { 
    long mtype;      /* type of message */ 
    char mtext[1000];   /* user-define message */ 
}; 

int main(){ 
    pid_t team,player; 
    int queue; 
    queue=msgget(IPC_PRIVATE,0600); 
    struct msgbuf buf1,buf2; 
    int cA,cB; 

    for(int i=0;i<1;i++){ 
     team=fork(); 
     switch(team){ 
      case -1: 
       exit(-1); 
      case 0: 

       for(int j=0;j<1;j++){ 
       player=fork(); 
       switch(player){ 
         case -1: 
          exit(-1); 
         case 0 : 
          printf("sono il figlio %d \n ",((i*5)+j)); 
          sprintf(buf1.mtext,"%d",10); 
          buf1.mtype=1; 
          cA=msgsnd(queue,&buf1,1000,0); 
          exit(0); 
        } 
       } 
       exit(0); 
       default: 
       sleep(1); 
       // flag 

     } 
    } 
    sleep(1); 
    // code 
    if(msgrcv(queue,&buf2,1000,1,0)==-1){ 
     perror("riceive "); 
    } 

    printf("%s\t%d\t%d\n",buf2.mtext,cA,cB); 
    // code 
} 

Dieser Code versuchen im Grunde, zwischen zwei verschiedenen Prozess zu kommunizieren. wer kann mir helfen, weil die msgrcv nicht die msg von msgsnd erhalten und ich verstehe nicht, warum .dieser code ist nur ein beispiel. Ich versuche auch, den Code wo ist die Flagge, aber ich weiß nicht, was ich glaube. irgendwelche Tipps?Ungültiges Argument auf msgrcv in c

Antwort

0

ok, ich gelöst von mir selbst, es ist ein Problem der Synchronisation des Prozesses und zwischen den msgsnd und msgrcv, in der Tat muss der Prozess, der die msgrcv ausführen vor dem Prozess ausgeführt werden, dass die msgsnd.

case 0 : 
         sleep (5); // 1 modification 
         printf("sono il figlio %d \n ",((i*5)+j)); 
         sprintf(buf1.mtext,"%d",10); 
         buf1.mtype=1; 
         cA=msgsnd(queue,&buf1,1000,0); 
         exit(0); 

.

if(msgrcv(queue,&buf2,1000,1,0)==-1){ 
    perror("riceive "); 
} 
sleep(6); 2 modification 
printf("%s\t%d\t%d\n",buf2.mtext,cA,cB); 

dankt den zwei Modifikationen der msgrcv vor dir msgsnd laufen müssen. Dies garantiert den korrekten Ablauf, der den Nachrichtenaustausch zwischen 2 verschiedenen Prozessen ermöglicht.

Verwandte Themen