Passer une struct dans une shared memory POSIX

cobbleguard Messages postés 6 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 20 avril 2006 - 13 avril 2005 à 17:19
cobbleguard Messages postés 6 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 20 avril 2006 - 14 avril 2005 à 09:14
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

4 réponses

garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
13 avril 2005 à 18:19
Vraissemblablement tu devrais commencer pas caster shm_ptr1 en struct
transport*
:
struct transport* transp_shm_ptr1 = (struct transport*) shm_ptr1;
trajet = *transp_shm_ptr1;

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
cobbleguard Messages postés 6 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 20 avril 2006
13 avril 2005 à 22:18
salut garslouche,

ta solution passe bien la compilation merci
Y a juste que ca me met une erreur a l'execution (segmentation fault (core dumped)) faut que je planche la dessus.
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
14 avril 2005 à 08:49
Le seg fault vient certainement d'un accès à une émoire qui n'est pas réservée à ton processus (c'est-à-dire justement ce pourquoi la shared memory est faite...). Je ne connais pas les fonctions de la shared memory POSIX et je ne sais donc pas m'en servir; je vais avoir du mal à t'aider davantage.
Ceci-dit il me semble que c'est dans l'utilisation de la mémoire partagée que le problème se trouve.
Je te conseille de passer tout ça au déboggeur pour voir où ça ne va plus.

Bonne prog

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
cobbleguard Messages postés 6 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 20 avril 2006
14 avril 2005 à 09:14
Merci quand meme, tu m'as envoye dans une bonne direction, je crois que le prob viens d'une mauvaie initialisation du pointeur de ma memoire, mais j'ai plus de chance de m'en tirer avec ça plutot que les opérations de cast (j'ai surmement du m'endormir pendant ce cours ;-)). Enfin tu m'as permis d'avancer, des que j'ai la solution je posterai le code
merci
0
Rejoignez-nous