Segmentation fault
Fermé
hwida12
Messages postés
15
Date d'inscription
vendredi 18 décembre 2009
Statut
Membre
Dernière intervention
19 janvier 2010
-
23 déc. 2009 à 20:28
hwida12 Messages postés 15 Date d'inscription vendredi 18 décembre 2009 Statut Membre Dernière intervention 19 janvier 2010 - 23 déc. 2009 à 22:10
hwida12 Messages postés 15 Date d'inscription vendredi 18 décembre 2009 Statut Membre Dernière intervention 19 janvier 2010 - 23 déc. 2009 à 22:10
Bonsoir,
En fait je suis entrain de faire quelques programmes en c sous linux (ubuntu)
sa se compile sans erreur mais lors de l'exécution sa me donne le message suivant::
houda@houda-laptop:~/Bureau$ ./sortie
Segmentation fault
Je ne sais pas de quoi il s'agit au juste?
En fait je suis entrain de faire quelques programmes en c sous linux (ubuntu)
sa se compile sans erreur mais lors de l'exécution sa me donne le message suivant::
houda@houda-laptop:~/Bureau$ ./sortie
Segmentation fault
Je ne sais pas de quoi il s'agit au juste?
5 réponses
hwida12
Messages postés
15
Date d'inscription
vendredi 18 décembre 2009
Statut
Membre
Dernière intervention
19 janvier 2010
23 déc. 2009 à 20:38
23 déc. 2009 à 20:38
voici le code:
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
#include <errno.h>
#define SHM_SIZE 1024
typedef struct
{
int t1[5];
}structure_partagee;
int main(int argc, char *argv[])
{
key_t clef ; // la clef associee au segment
pid_t pid ;
char *mem ;
int shmid ; // l'identificateur du segment de memoire partagee
int t[5]={214,4553,65,90,123};
// J'instancie une structure "structure_partagee" et je l'appelle data.
structure_partagee *data;
char *name = (char *) malloc(15*sizeof(char)) ;
int i;
/* construire
une cle identifiant le segment */
clef = ftok(name,(key_t) clef) ;
/*indiquer
les droits d'acces de ce segment de memoire */
shmid = shmget((key_t)clef, SHM_SIZE,0644|IPC_CREAT ) ;
if ( shmid== -1 )
{
perror("shmget") ;
exit(1) ;
}
pid =fork() ;
if(pid > 0)
{//père
mem = (char*) shmat(shmid,(void*)0, 0);
if (mem ==(char*)-1)
{
perror("shmat") ;
exit(1) ;
}
for(i=0; i<5; i++)
{
(*data).t1[i]=t[i];
}
if(shmdt(mem)==-1)
{
perror("shmdt");
exit(1);
}
}
else if(pid==0)//fils
{
printf("Je suis le fils\n") ;
mem = (char*)shmat(shmid,(void*)0,0) ;
if (mem ==(char*)-1){
perror("attachement impossible") ;
exit(1) ;
}
for(i=0; i<5; i++)
{
printf("%d\n",(*data).t1[i]);
}
//printf("ecrit dans le segment: %s \n",mem);
if(shmdt(mem)==-1)
{
perror("shmdt");
exit(1);
}
return(0);
}
}
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
#include <errno.h>
#define SHM_SIZE 1024
typedef struct
{
int t1[5];
}structure_partagee;
int main(int argc, char *argv[])
{
key_t clef ; // la clef associee au segment
pid_t pid ;
char *mem ;
int shmid ; // l'identificateur du segment de memoire partagee
int t[5]={214,4553,65,90,123};
// J'instancie une structure "structure_partagee" et je l'appelle data.
structure_partagee *data;
char *name = (char *) malloc(15*sizeof(char)) ;
int i;
/* construire
une cle identifiant le segment */
clef = ftok(name,(key_t) clef) ;
/*indiquer
les droits d'acces de ce segment de memoire */
shmid = shmget((key_t)clef, SHM_SIZE,0644|IPC_CREAT ) ;
if ( shmid== -1 )
{
perror("shmget") ;
exit(1) ;
}
pid =fork() ;
if(pid > 0)
{//père
mem = (char*) shmat(shmid,(void*)0, 0);
if (mem ==(char*)-1)
{
perror("shmat") ;
exit(1) ;
}
for(i=0; i<5; i++)
{
(*data).t1[i]=t[i];
}
if(shmdt(mem)==-1)
{
perror("shmdt");
exit(1);
}
}
else if(pid==0)//fils
{
printf("Je suis le fils\n") ;
mem = (char*)shmat(shmid,(void*)0,0) ;
if (mem ==(char*)-1){
perror("attachement impossible") ;
exit(1) ;
}
for(i=0; i<5; i++)
{
printf("%d\n",(*data).t1[i]);
}
//printf("ecrit dans le segment: %s \n",mem);
if(shmdt(mem)==-1)
{
perror("shmdt");
exit(1);
}
return(0);
}
}
j'ai tester ton code chez moi
effectivement on obtient une Erreur de segmentation, ce qui nous amene a la conclusion que tu essaye d'acceder une zone memoire alors que tu en pas le droits. donc petit passage par gdb qui franchement ne me donne aucune information( normal manque de concentration ya bordeaux qui joue) mais j'ai alloué de la memoire pour ta structure et la plus derreur de segmentation mais ya que le fils qui affiche une suite de 0;
login $$:./tester
Je suis le fils
0
0
0
0
0
login $$:
essaye de verifier l'initiatlisation de tes variables et j'essaye de mon cote a la mi temps...
effectivement on obtient une Erreur de segmentation, ce qui nous amene a la conclusion que tu essaye d'acceder une zone memoire alors que tu en pas le droits. donc petit passage par gdb qui franchement ne me donne aucune information( normal manque de concentration ya bordeaux qui joue) mais j'ai alloué de la memoire pour ta structure et la plus derreur de segmentation mais ya que le fils qui affiche une suite de 0;
login $$:./tester
Je suis le fils
0
0
0
0
0
login $$:
essaye de verifier l'initiatlisation de tes variables et j'essaye de mon cote a la mi temps...
hwida12
Messages postés
15
Date d'inscription
vendredi 18 décembre 2009
Statut
Membre
Dernière intervention
19 janvier 2010
23 déc. 2009 à 21:33
23 déc. 2009 à 21:33
De même moi j'ai fait ceci
structure_partagee data;
au lieu de déclaré ma structure comme étant pointeur , par contre sa me donne tjrs des 0 de la part du fils. Je vais essayer encore et je te dirais où est ce que je suis arrivée.
Merci bcppp pour tes réponses.
structure_partagee data;
au lieu de déclaré ma structure comme étant pointeur , par contre sa me donne tjrs des 0 de la part du fils. Je vais essayer encore et je te dirais où est ce que je suis arrivée.
Merci bcppp pour tes réponses.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
hwida12
Messages postés
15
Date d'inscription
vendredi 18 décembre 2009
Statut
Membre
Dernière intervention
19 janvier 2010
23 déc. 2009 à 22:10
23 déc. 2009 à 22:10
Même si j'ai alloué de la mémoire à ma structure , cette fois ci sa donne :
houda@houda-laptop:~/Bureau$ ./out
Réception fils1
0
0
0
0
Réception fils2
0
0
0
0
fork(): Success
houda@houda-laptop:~/Bureau$ ./out
Réception fils1
0
0
0
0
Réception fils2
0
0
0
0
fork(): Success