Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Passer une struct dans une shared memory POSIX [ Archives / Au secours ] (cobbleguard)

mercredi 13 avril 2005 à 17:19:11 | Passer une struct dans une shared memory POSIX

cobbleguard

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


mercredi 13 avril 2005 à 18:19:42 | Re : Passer une struct dans une shared memory POSIX

garslouche

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

mercredi 13 avril 2005 à 22:18:45 | Re : Passer une struct dans une shared memory POSIX

cobbleguard

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.

jeudi 14 avril 2005 à 08:49:59 | Re : Passer une struct dans une shared memory POSIX

garslouche

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

jeudi 14 avril 2005 à 09:14:43 | Re : Passer une struct dans une shared memory POSIX

cobbleguard

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



Cette discussion est classé dans : int, struct, ret, trajet, shm


Répondre à ce message

Sujets en rapport avec ce message

Probleme de reception dans un serveur visual C++ pour windows [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi.voici les source du client et du serveurLe Serveur pb de retour( du tableau) de ma fonction [ par airwann ] bonjour,j ai un problème comment dois je modifier l'entête de ma fonction pour recupérer le tableau de structure 3 d alloué dynamiquementmerci d avanc Passage par adresse d'un tableau de structures. [ par alekine ] Bonjour, j'ai un problème pour passer par adresse un tableau de structures. Voilà mon code:#include #define L_MAX 2struct point //la structure d'un p compression de huffman urgent svp [ par bundy_boy ] Bonjour voila, j'essai d'implémenter la compression de huffman dans un archiveur (qui lui fonctionne très bien), j'ai testé deux algorithmes de huffma PB compilation de socket [ par dhylde ] Bonjour a tous, j'ai un petit souci de compilation (j'ai du manqué l'inclusion d'une Librairy). Bref je me prend la tete depuis ce matin. Je suis sous Problème pour compiler du c [ par flox39 ] Salut à tous Je suis en galère avec du code qu'on m'a passé je n'arrive pas a le compilerl'erreur c error C2447: missing function header (old-style fo Comment imprimer le contenu d'une structure? [ par madalf17 ] Salut, j'aimerai savoir comment imprimer le contenu d'une structure.Voici une partie du code dont la fonction affichage, je voudrai imprimer ce que ce pb avec des structures [ par tomalille ] Bonjour, j'ai un probleme avec l'utilisation de structure. Je declare mon struct en globale, je l'utilise ensuite dans une procedure qui remplit un ta struct ? [ par tomalille ] Bonjour, j'ai un petit pb avec mes structs. je vous explique: je definis un struct en globale pour l'utiliser dans une procedure qui lit des donnees a struct [ par tomalille ] Bonsoir, j'ai un probleme l'utilisation de structs: Voici une partie de mon code: void lectureNoeuds(struct NOEUDS *noeuds,struct INTERFACENOEUD **int


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.