Erreur de segmentation avc file de message :/

paladice -  
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,

j'ai un petit problème avec mon code et j'éspère que vous pourrez m'aider :'( .

J'essaie d'apprendre le langage C par moi-même mais j'avoue que parfois je bloque. Et c'est le cas avec le problème que je vais vous exposé et que j'ai depuis deux jours.

Alors voilà, je commence a comprendre comment fonctionnent les IPC et là je m'exerce avec les files de message. Cependant, je me retrouve avec une erreur de segmentation et je ne sais pas comment la résoudre. Voici une partie de mon code :

#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 
#include<unistd.h> 
#include<sys/shm.h> 
#include<sys/ipc.h> 
#include<sys/types.h> 
#include<string.h> //pour les strcpy,strcmp... 

#define CLE 142 

typedef struct msgTxt_tag 
{ 
 long mtype; 
 char mtext [256]; 
}msgTxt; 

int main(){ 

 //creation de la memoire partagee 
  
printf("Creation des variables\n"); 

 int shmid ; 
 int idMsg; 
 int empl; 
 int depl; 
 char monDepl [256]; 
 char monEmpl [256]; 
 //Ces variables contiendrons les informations luent dans la file de message modifiée par le serveur humain 
 msgTxt* msgEmpl; 
 msgTxt* msgDepl; 
 msgTxt* lalaEmpl; 
 msgTxt* lalaDepl; 

printf("Affectation monDepl,monEmpl\n"); 

 strcpy(monDepl,"droite"); 
 strcpy(monEmpl,"25"); 

printf("Creation file de message\n"); 

 idMsg = msgget((key_t)CLE,IPC_CREAT|0666); 
 if(idMsg == (-1)) 
 { 
  fprintf(stderr,"Erreur creation file de mess"); 
  exit (-1); 
 } 

printf("Affectation lalaEmpl,lalaDepl\n"); 
  
 lalaEmpl->mtype=0; 
 strcpy(lalaEmpl->mtext,monEmpl); 

 lalaDepl->mtype=1; 
 strcpy(lalaDepl->mtext,monDepl); 

printf("msgsnd\n"); 

 msgsnd(idMsg, &lalaEmpl,sizeof(msgTxt),0); 
 msgsnd(idMsg, &lalaDepl,sizeof(msgTxt),0); 
  
printf("msgrcv\n"); 

 msgrcv(idMsg, &msgEmpl, sizeof(msgTxt),0,NULL); 
 msgrcv(idMsg, &msgDepl, sizeof(msgTxt),1,NULL); 

printf("tests\n"); 

 if(msgDepl->mtext == "haut"){ 
  printf("rentre dans le if\n"); 
  depl = 1;} 
 else 
 { 
  printf("oups\n"); 
  printf("rentre dans le else %c\n",msgDepl->mtext[1]);
  if(msgDepl->mtext == "droite"){ 
   printf("rentre dans le if\n"); 
   depl = 2;} 
  else 
  { 
   printf("rentre dans le else\n"); 
   if(msgDepl->mtext == "bas"){ 
    printf("rentre dans le if\n"); 
    depl = 3;} 
   else 
   { 
    printf("rentre dans le else\n"); 
    depl = 4; 
   } 
  } 
 } 
 empl = atoi(msgEmpl->mtext);

        return 0; 
} 


et voici laffichage de lexecution :

Creation des variables
Affectation monDepl,monEmpl
Creation file de message
Affectation lalaEmpl,lalaDepl
msgsnd
msgrcv
tests
oups
Erreur de segmentation

si je ne met pas la ligne printf("rentre dans le else %c\n",msgDepl->mtext[1]); que j'ai souligne, lerreur de segmentation surviens a la ligne empl = atoi(msgEmpl->mtext); elle aussi soulignee

J'espere que vous pourrez m'aider :) merci d'avance
A voir également:

5 réponses

fiddy Messages postés 11653 Statut Contributeur 1 847
 
Bonjour,

Comme dit plus haut, la comparaison entre chaîne de caractères en C s'effectue avec strcmp pas avec ==. Mais l'erreur ne vient pas de là.

En C, il est important de vérifier les valeurs des retours des fonctions.
Par exemple : msgrcv renvoie -1 lorsqu'il y a eu une erreur. errno te donnera des précisions sur l'erreur. C'est une bonne piste à creuser je pense.

Cdlt,
1
Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
 
Bonjour,
Le problème c'est que vous utilisez des pointeurs avec le typedef et affectez des valeurs alors qu'ils pointent n'importe où vu qu'il n'y a aucune allocation
Le premier segfault est ici :
lalaEmpl->mtype=0;
etc
pour résoudre pouvez faire directement :
msgTxt lalaEmpl;
et modifier le reste en fonction,
ou vous pouvez continuer d'utiliser des pointeurs mais alors il faut allouer un emplacement de la taille du type et mettre le pointeur dessus :
msgTxt *lalaEmpl=malloc(sizeof(msgTxt));

Edit : pour trouver rapidement d'où vient le problème dans ces cas là utilisez gdb, compilez avec l'option -g exemple :
gcc -g main.c
ça va vous sortir un a.out que vous lancer avec gdb exemple :
gdb a.out
une fois dans gdb utilisez la commande run pour lancer le programme, gdb va s'arrêter à l'erreur, exemple de sortie :
(gdb) run
Starting program: a.out
Creation des variables
Affectation monDepl,monEmpl
Creation file de message
Affectation lalaEmpl,lalaDepl

Program received signal SIGSEGV, Segmentation fault.
0x080486a8 in main () at plop.c:53
53        lalaEmpl->mtype=0;
1
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Ah oui, j'ai pas fait attention à ça.
Bien vu.
0
paladice
 
merci beaucoup ! je vais regarder ça et je vous tiens au courant =) merci
0
swoog42 Messages postés 1178 Statut Membre 244
 
Pas sur, mais a mon avis, c'est la que ca merde :
strcpy(lalaDepl->mtext,monDepl);

Tu ne spécifie pas le champ dans lequel tu copies ton texte ^^
0
swoog42 Messages postés 1178 Statut Membre 244
 
Euh... Je débloque, ne tiens pas compte de cette remarque :s
manque de sommeil
0
paladice
 
merci quand même ;) une autre idée ?
0
swoog42 Messages postés 1178 Statut Membre 244
 
Déjà ce genre de ligne je n'aime pas :
if(msgDepl->mtext == "haut")


On compare généralement les chaines avec
int strcmp ( const char * str1, const char * str2 );

Mais je ne pense pas que ton problème vienne de là.

Si tu trouve, fais moi un retour.
0
paladice
 
eh bien en fait justement, j'ai assayer avec strcmp mais tout comme atoi, j'obtiens une erreur de segmentation :'( je pense que mon erreur viens des msgsnd et msgrcv mais je n'arrive pas a voir pourquoi...
0
swoog42 Messages postés 1178 Statut Membre 244
 
si tu as une erreur de segmentation avec un strcmp, c'est que tu ne dois pas passer le bon pointeur à ta fonction
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Beh, plutôt que chercher d'autres explications, as-tu corrigé les points mentionnés par Hxyp et par moi-même ?
A savoir : l'allocation non faite des buffer (malloc)
Et l'utilisation de strcmp pour comparer des chaînes de caractères ?

La correction de ces points corrigera ton problème je pense.
Tiens-nous au courant.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
paladice
 
paladice - 9 avr 2011 à 14:18
merci beaucoup ! je vais regarder ça et je vous tiens au courant =) merci
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Oui, désolé ^^. Avec l'organisation bizarre des réponses, j'ai cru que t'étais parti sur une autre piste.
Je me tais :-D.
0