Salut,
J'ai 3 processus indépendants qui communiquent.
PS1 reçoit des valeurs saisies au clavier, les met dans une structure et les envoie au PS2 via un tube nommé (pas de probleme)
PS2 recoit les donnees du PS1 par le tube et les envoie dans une memoire partagée (j'ai eu des prob de compilation mais je pense que c'est resolu). CC me mettait une erreur de casting entre un pointeur caddr_t et ma structure (j'ai aussi essaye avec un char a la place de la structure-->pas de prob). J'ai modifie le code, plus d'erreur mais ne sais pas verifier a cause du PS3.
Le PS3 est une supervision qui lit ce qui se trouve en memoire partagee, et la je me retrouve avec la meme erreur de casting :-(
Je coince un peut la dessus et je ne sais pas avancer dans mon develloppement. Une idée???
code du PS2
int ret_val ;
struct transport
{
int actuel ;
int dest ;
int NB_pass;
};
/*___________________________________DECLARATIONS POUR MEMOIRE PARTAGEE GLOBLALE_____*/
int shm_etage1;
int shm_etage2;
caddr_t shm_ptr1;
caddr_t shm_ptr2;
main (int argc, char *argv[])
{
printf("\n\t\tPROGRAMME PRINCIPAL");
int lire;
char lettre = 'A';
int i;
struct transport trajet;
int t=1;
trajet.actuel=0;
trajet.dest=0;
trajet.NB_pass=0;
lire = open("tube", O_RDONLY);
shm_etage1 = shm_open ( "/tmp/etage1", (O_CREAT | O_RDWR), 0 );
shm_etage2 = shm_open ( "/tmp/etage2", (O_CREAT | O_RDWR), 0 );
ret_val = fchmod ( shm_etage1 , (mode_t) S_IRWXG | S_IRWXU | S_IRWXO );
ret_val = fchmod ( shm_etage2 , (mode_t) S_IRWXG | S_IRWXU | S_IRWXO );
ret_val = ftruncate (shm_etage1, sizeof(struct transport));
ret_val = ftruncate (shm_etage2, sizeof(struct transport));
shm_ptr1 = mmap ((caddr_t) 0, sizeof(struct transport), PROT_WRITE|PROT_READ, MAP_SHARED, shm_etage1, 0 );
shm_ptr2 = mmap ((caddr_t) 0, sizeof(struct transport), PROT_WRITE|PROT_READ, MAP_SHARED, shm_etage2, 0 );
while(trajet.NB_pass != -1)
{
read(lire,(char*) &trajet,sizeof(struct transport));
printf("\nTrajet %d : %d passagers vont de l'etage %d a l'etage %d", t++, trajet.NB_pass, trajet.actuel, trajet.dest);
struct transport shm_ptr1= trajet;
}
//close("tube");
printf("\nFIN PROGRAMME");
ret_val = munmap ( shm_ptr1 , sizeof(struct transport) );
ret_val = munmap ( shm_ptr2 , sizeof(struct transport) );
ret_val = close ( shm_etage1 );
ret_val = close ( shm_etage2 );
ret_val = shm_unlink ( "/tmp/etage1" );
ret_val = shm_unlink ( "/tmp/etage2" );
}
___________________________________________________________
Code du PS3
/*___________________________________DECLARATIONS POUR MEMOIRE PARTAGEE GLOBLALE_____*/
int shm_etage1;
int shm_etage2;
caddr_t shm_ptr1;
main (int argc, char *argv[])
{
struct transport trajet;
shm_etage1 = shm_open ( "/tmp/etage1", ( O_RDWR), 0 );
shm_ptr1 = mmap ((caddr_t) 0, 3, PROT_READ, MAP_SHARED, shm_etage1, 0 );
sleep(2);
trajet = *shm_ptr1;
printf("actuel %d, dest %d, nbpass %d", trajet.actuel, trajet.dest, trajet.NB_pass);
//printf("\n en memoire : %c", d);
ret_val = munmap ( shm_ptr1 , 3 );
ret_val = close ( shm_etage1 );
}
l'erreur est a la ligne : trajet= *shm_ptr1;
Merci