Erreur de segmentation avc file de message :/
paladice
-
fiddy Messages postés 11653 Statut Contributeur -
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 :
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
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:
- Erreur de segmentation avc file de message :/
- Recuperer message whatsapp supprimé - Guide
- .Dat file - Guide
- Host file - Guide
- .Bin file - Guide
- Message absence thunderbird - Guide
5 réponses
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,
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,
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 :
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;
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 ^^
strcpy(lalaDepl->mtext,monDepl);
Tu ne spécifie pas le champ dans lequel tu copies ton texte ^^
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question