Segmentation fault

hwida12 Messages postés 18 Statut Membre -  
hwida12 Messages postés 18 Statut Membre -
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?
Configuration: Linux
Firefox 3.0.3

5 réponses

  1. callfinger
     
    pense a joindre ton code sinon ça va compliqué de commenté
    0
  2. hwida12 Messages postés 18 Statut Membre
     
    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);
    }
    }
    0
  3. callfinger
     
    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...
    0
  4. hwida12 Messages postés 18 Statut Membre
     
    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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. hwida12 Messages postés 18 Statut Membre
     
    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
    0