IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème d'attachement à une mémoire partagée


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut Problème d'attachement à une mémoire partagée
    Bonjour à tous,

    Je cherche à faire basiquement communiquer deux processus par une mémoire partagée. Le problème se situe lorsque je fais la demande d'attacher ma mémoire partagée à mon processus. (je dis mon car l'un des procesus est le fils de l'autre ultérieurement). Le message d'erreur est le suivant:

    Identifier removed:
    L'erreur se situe à la ligne 35!


    J'ai beau caster mes pointeurs sur tout et n'importe quoi, pas moyen.
    (J'essaie en effet de récupérer l'adresse mémoire dans une variable de type pointeur)
    Pouvez-vous m'aider?

    Merci d'avance!

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
      1 #include <stdio.h>
      2 #include <sys/types.h>
      3 #include <sys/ipc.h>
      4 #include <sys/shm.h>
      5 #include <signal.h>
      6 
      7 #define cle 100
      8 #define TAILLE 1000
      9 
     10 int mp_ID;
     11 void *p;  // pointeur sur mon segment de mémoire partagée
     12 int info, pid;
     13 int i, Nb_Elem;
     14 
     15 
     16 void reveil();
     17 void fin();
     18 
     19 
     20 int main()
     21   {
     22     //printf("Bonjour!\n");
     23 
     24     for (i=0;i<NSIG;i++)
     25        signal(i,fin);   // à a réception d'un tout autre signal que ceux spécifiés par la suite, la fonction fin est appelée.
     26 
     27 
     28     if (mp_ID = shmget (cle, TAILLE, 0666|IPC_CREAT) == -1) // création d'un segment de mémoire partagée 
     29       {
     30         perror("Erreur de création\n");
     31         return(1);
     32       }
     33     (
     34 
     35     if ((p=shmat(mp_ID,NULL,0)) == (void*)-1)   // demande d'attachement du segment de mémoire partagée à une adresse laissée au soin du système d'exploitation
     36       {
     37         perror("Erreur d'attachement\n");
     38         return(1);
     39       }
     40 
     41     int*(p);                        // je caste mon pointeur p sur un entier
     42     signal (SIGUSR1,reveil);       // à la réception de SIGUSR1 la fonction réveil est appelée (qui reprotègera contre le même signal)
     43     Nb_Elem = TAILLE/sizeof(int);  // Nombre d'éléments inscriptible dans la mémoire partagée
     44 
     45 
     46     if ((pid = fork()) == 0) // Je suis Reception et j'écris dans la MP
     47       {
     48         for (i=0; i<Nb_Elem; i++)
     49           {
     50 
     51             p[i]=i*2;
     52 
     53             printf("Je suis Reception, le fils, et j'ai écrit %d à la case %d de la mp\n", p[i],i);
     54             kill(getppid(),SIGUSR1);
     55             pause();
     56           }
     57       }
     58 
     59     else  // Je suis Decode et je lis dans la MP
     60       {
     61         for (i=0; i<Nb_Elem; i++)
     62           {
     63             pause();
     64             printf("Je suis Decode, le père, et je lis %d à la case %d de la mémoire partagee\n",p[i],i);
     65             kill(pid,SIGUSR1);
     66           }
     67       }
     68   return(0);
     69   }
     70 
     71 
     72 
     73 void reveil()
     74   {
     75     signal(SIGUSR1,reveil);         // protection contre le signal SIGUSR1 
     76   }
     77 
     78 
     79 void fin()
     80   {
     81     shmdt((char*)p);            // détachement de la mémoire partagée
     82     shmctl(mp_ID,IPC_RMID,0);      // destruction de la mémoire partagée
     83     exit(1);
     84   }
     85

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Il y a une parenthèse en trop à la ligne 33.

    D'autre part, pour info, return est un mot-clé et pas une fonction. Pas besoin de mettre des parenthèses.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Merci pour ces précisions. Elles sont corrigées: pour la parenthèse j'ai dû faire une erreur en copiant le code.

    Cependant, l'erreur est toujours là...

    N.B: J'ai oublié j'ai un warning à la compilation:
    assignment makes pointer from integer without a cast

    Merci encore pour vos réponses!

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par Marco88 Voir le message
    Merci pour ces précisions. Elles sont corrigées: pour la parenthèse j'ai dû faire une erreur en copiant le code.

    Cependant, l'erreur est toujours là...
    L'erreur est à la ligne 28. L'opérateur de comparaison « == » est plus prioritaire que l'opérateur d'affectation « = ». Ton programme commence donc par regarder si la création de ton segment a renvoyé « -1 », ce qui n'est pas le cas puisque tout s'est bien passé. La comparaison renvoie donc « 0 » et l'affecte à mp_ID. Finalement, le « if() » fait son office mais, comme le résultat est nul, il n'entrera pas dans le bloc, ne déclenchera pas d'erreur, et le programme continuera à se dérouler normalement. À la ligne d'après, tu essaies d'attacher le segment d'ID « 0 » et là, ça bloque.

    N.B: J'ai oublié j'ai un warning à la compilation:
    assignment makes pointer from integer without a cast
    Un transtypage n'est pas permanent. Ta ligne 41 ne fait probablement pas ce que tu crois.

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup c'était tout à fait le problème.... 2 parenthèses

    => Donc à retenir: priorité de l'opérateur "==" sur "=".

    Pour ce qui est de ma ligne 41, j'ai tout simplement déclaré p comme un pointeur sur un int ce qui m'évite de le caster plus loin et de rencontrer des problèmes de transcryptage.


    Merci pour tes réponses rapides.

    A bientot

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'accès à une variable partagée
    Par sebac dans le forum Général Java
    Réponses: 1
    Dernier message: 04/09/2009, 12h11
  2. [SQL 2K5] Problème de version pour attacher une base
    Par Jinroh77 dans le forum Administration
    Réponses: 8
    Dernier message: 03/10/2008, 17h19
  3. [C#] Modifier une zone de mémoire partagée
    Par the_real_hnk dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/11/2007, 17h21
  4. Réponses: 6
    Dernier message: 27/03/2007, 08h23
  5. Utilisation simple d'une mémoire partagée sous linux
    Par dreamteam dans le forum Linux
    Réponses: 1
    Dernier message: 09/02/2007, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo