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 
} 

ce code essaie essentiellement de communiquer entre deux processus différents. qui peut m'aider, car les msgrcv ne reçoivent pas le msg du msgsnd et je ne comprends pas pourquoi .ce code n'est qu'un échantillon. j'essaye aussi de mettre le code où est le drapeau mais de toute façon je ne crois pas ce que je crois. des astuces?Argument invalide sur msgrcv dans c

Répondre

0

ok, j'ai résolu par moi-même, c'est un problème de synchronisation du processus et entre msgsnd et msgrcv, en fait le processus qui exécute le msgrcv doit être exécuté avant le processus qui fait le 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); 

Merci aux 2 modifications que le msgrcv doit exécuter avant le msgsnd. Cela garantit le bon fonctionnement qui permet l'échange de message entre 2 processus différents.