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

Linux Discussion :

Problème shmat !


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    aze
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : aze

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Par défaut Problème shmat !
    Bonjour à tous !

    J'ai un soucis dans le cadre d'un portage d'une appli 32 bits en 64, en C, sur un AIX 5.3.
    Le problème se situe au niveau d'un appel à shmat qui renvoie un pointeur nul. Ce qui est bizarre c'est que l'appel à shmat passe bien (i.e. il ne renvoie pas -1), et qui cela passe sans problème en 32 bits.
    La mémoire est bien crée et je la vois bien en faisant un ipcs -m.

    J'ai changé la clé par rapport à la version 32 bits, histoire d'être sûr de taper sur quelque chose de vierge, et avant chaque exécution je vérifie que tout va bien avec ipcs -m, quitte à supprimer les zones mémoire non supprimées du au plantage de l'essai précédent.

    Bon, voila le bout de code qui ne va pas !

    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
     
    /* la création */
      MemSize = size;
      /* Essai de création de mémoire partagée associée à 'key' */
      if ((MemId = shmget(key, WRAPPER_MemSize, IPC_CREAT | S_IRUSR | S_IWUSR)) == -1)
      {
        printf("[WRAPPER_CreateSharedMemory] %d %s\n", WRAPPER_MemId, trerror(errno) );
        return -1;
      }
    printf("[WRAPPER_CreateSharedMemory] mem ok %d\n", WRAPPER_MemId);
     
     
     
    /* la partie qui pose pb */
    errno=0;
    MemAddr=&resmem;
    printf("MemAddr =%p\n", (void*)MemAddr);
    if ( (MemAddr = (char *) shmat(WRAPPER_MemId, 0, 0)) == BAD_ADDR)
    {
        Trace_log((char *)"Echec de connexion à la mémoire partagée\n",1);
        perror("shmat: ");
        printf("[AttachSharedMemory] Mem:%p\n",(void*)MemAddr);
        return NULL;
    }
     
    if (MemAddr == NULL)
    {
        perror("shmat");
        printf("[AttachSharedMemory] SHMAT retour nul... : Mem:%x, %s\n", (void*)MemAddr, strerror(errno));
    }
    else 
       printf("[AttachSharedMemory] memoire ok\n");
    Voila, j'ai un peu tout essayé dans les options de ces deux fonctions... Si vous avez des idées je suis preneur !
    J'ai beaucoup de mal à trouver de la doc sur ce cas qui n'est pas détaillé dans le man (ou dans la doc officielle IBM d'ailleurs).

    Merci d'avance !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par scougirou Voir le message
    Bonjour à tous !

    J'ai un soucis dans le cadre d'un portage d'une appli 32 bits en 64, en C, sur un AIX 5.3.
    Le problème se situe au niveau d'un appel à shmat qui renvoie un pointeur nul. Ce qui est bizarre c'est que l'appel à shmat passe bien (i.e. il ne renvoie pas -1), et qui cela passe sans problème en 32 bits.
    La mémoire est bien crée et je la vois bien en faisant un ipcs -m.

    J'ai changé la clé par rapport à la version 32 bits, histoire d'être sûr de taper sur quelque chose de vierge, et avant chaque exécution je vérifie que tout va bien avec ipcs -m, quitte à supprimer les zones mémoire non supprimées du au plantage de l'essai précédent.

    Bon, voila le bout de code qui ne va pas !

    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
     
    /* la création */
      MemSize = size;
      /* Essai de création de mémoire partagée associée à 'key' */
      if ((MemId = shmget(key, WRAPPER_MemSize, IPC_CREAT | S_IRUSR | S_IWUSR)) == -1)
      {
        printf("[WRAPPER_CreateSharedMemory] %d %s\n", WRAPPER_MemId, trerror(errno) );
        return -1;
      }
    printf("[WRAPPER_CreateSharedMemory] mem ok %d\n", WRAPPER_MemId);
     
     
     
    /* la partie qui pose pb */
    errno=0;
    MemAddr=&resmem;
    printf("MemAddr =%p\n", (void*)MemAddr);
    if ( (MemAddr = (char *) shmat(WRAPPER_MemId, 0, 0)) == BAD_ADDR)
    {
        Trace_log((char *)"Echec de connexion à la mémoire partagée\n",1);
        perror("shmat: ");
        printf("[AttachSharedMemory] Mem:%p\n",(void*)MemAddr);
        return NULL;
    }
     
    if (MemAddr == NULL)
    {
        perror("shmat");
        printf("[AttachSharedMemory] SHMAT retour nul... : Mem:%x, %s\n", (void*)MemAddr, strerror(errno));
    }
    else 
       printf("[AttachSharedMemory] memoire ok\n");
    Voila, j'ai un peu tout essayé dans les options de ces deux fonctions... Si vous avez des idées je suis preneur !
    J'ai beaucoup de mal à trouver de la doc sur ce cas qui n'est pas détaillé dans le man (ou dans la doc officielle IBM d'ailleurs).

    Merci d'avance !
    Tu récupères l'identifiant de ta shm dans une variable nommée "MemId" puis tu passes à shmat() une variable nommée "WRAPPER_MemId"
    Les deux variables ne sont pas les mêmes...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    aze
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : aze

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Par défaut
    Ah oui, désolé, ce sont les même en fait, j'ai remplacé les anciens noms de variables par des trucs plus simples, histoire que ce soit plus lisible !
    Encore désolé !

    Voila le code re-nettoyé :

    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
    /* la création, cette partie est OK et je peux visualiser la mémoire partagée dans un ipcs */
      MemSize = size;
      /* Essai de création de mémoire partagée associée à 'key' */
      if ((MemId = shmget(key, MemSize, IPC_CREAT | S_IRUSR | S_IWUSR)) == -1)
      {
        printf("[CreateSharedMemory] %d %s\n", MemId, trerror(errno) );
        return -1;
      }
    printf("[CreateSharedMemory] mem ok %d\n", MemId);
     
     
     
    /* la partie qui pose pb */
    errno=0;
    MemAddr=&resmem;
    printf("MemAddr =%p\n", (void*)MemAddr);
    if ( (MemAddr = (char *) shmat(MemId, 0, 0)) == BAD_ADDR)
    {
        /* NE PASSE PAS ICI */
        Trace_log((char *)"Echec de connexion à la mémoire partagée\n",1);
        perror("shmat: ");
        printf("[AttachSharedMemory] Mem:%p\n",(void*)MemAddr);
        return NULL;
    }
     
     
    if (MemAddr == NULL)
    {
        /* PASSE ICI */
        perror("shmat");
        printf("[AttachSharedMemory] SHMAT retour nul... : Mem:%x, %s\n", (void*)MemAddr, strerror(errno));
    }
    else 
       printf("[AttachSharedMemory] memoire ok\n");
    return(MemAddr);
    Merci d'avance, ça va faire quelques jours que je tourne en rond là dessus.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par scougirou Voir le message
    Ah oui, désolé, ce sont les même en fait, j'ai remplacé les anciens noms de variables par des trucs plus simples, histoire que ce soit plus lisible !
    Encore désolé !

    Voila le code re-nettoyé :

    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
    /* la création, cette partie est OK et je peux visualiser la mémoire partagée dans un ipcs */
      MemSize = size;
      /* Essai de création de mémoire partagée associée à 'key' */
      if ((MemId = shmget(key, MemSize, IPC_CREAT | S_IRUSR | S_IWUSR)) == -1)
      {
        printf("[CreateSharedMemory] %d %s\n", MemId, trerror(errno) );
        return -1;
      }
    printf("[CreateSharedMemory] mem ok %d\n", MemId);
     
     
     
    /* la partie qui pose pb */
    errno=0;
    MemAddr=&resmem;
    printf("MemAddr =%p\n", (void*)MemAddr);
    if ( (MemAddr = (char *) shmat(MemId, 0, 0)) == BAD_ADDR)
    {
        /* NE PASSE PAS ICI */
        Trace_log((char *)"Echec de connexion à la mémoire partagée\n",1);
        perror("shmat: ");
        printf("[AttachSharedMemory] Mem:%p\n",(void*)MemAddr);
        return NULL;
    }
     
     
    if (MemAddr == NULL)
    {
        /* PASSE ICI */
        perror("shmat");
        printf("[AttachSharedMemory] SHMAT retour nul... : Mem:%x, %s\n", (void*)MemAddr, strerror(errno));
    }
    else 
       printf("[AttachSharedMemory] memoire ok\n");
    return(MemAddr);
    Merci d'avance, ça va faire quelques jours que je tourne en rond là dessus.
    Et que te dis "strerror(errno)" ???

    Sinon le code ne pourra jamais passer par la partie dénommée "NE PASSE PAS ICI" vu que MemAdr vaut NULL et donc ne vaut pas "BAD_ADDR"

    Autre chose => tu utilises dans shmget() les flag S_IRUSR et S_IWUSR qui sont des flags de "stat.h" utilisés pour les droits des fichiers. A l'époque où je faisais de la shm, j'utilisais les flag SHM_R et SHM_W qui étaient dédiés à l'outil shm. Il est possible que les choses aient changées depuis mais tu devrais vérifier ce détail...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    aze
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : aze

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Par défaut
    Merci d'avoir regardé !
    Bon, je réinitialise errno à 0 avant chaque appel un peu "touchy", histoire d'être sur que le errno n'avait pas gardé une ancienne valeur. C'est effectivement ce qui se passait avant (le strerror affichait un "permission denied" qui n'était pas écrit par la fonction en question, mais par quelque chose d'autre). Au fait, j'ai pas trouvé grand chose sur la gestion du errno. Il y a une bonne doc qui détaille un peu comment ça marche ?
    Là le shmat ne plante pas (il ne retourne pas -1, et le errno reste à 0).
    Donc textuellement strerror(errno) dit "0". "BAD_ADDR" est en fait un #define à -1.

    Au niveau des permissions, je pense qu'elles sont ok pour deux raisons : ce sont celles qui sont employées dans la version 32 bits, et tout marche bien en 32 bits, et elles correspondent bien aux droits que l'on peut voir avec ipcs -m. Sinon les intitulés des flags correspondent bien à la doc de mon système.

    Merci encore, je commence à désespérer.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par scougirou Voir le message
    Merci d'avoir regardé !
    Bon, je réinitialise errno à 0 avant chaque appel un peu "touchy", histoire d'être sur que le errno n'avait pas gardé une ancienne valeur. C'est effectivement ce qui se passait avant (le strerror affichait un "permission denied" qui n'était pas écrit par la fonction en question, mais par quelque chose d'autre). Au fait, j'ai pas trouvé grand chose sur la gestion du errno. Il y a une bonne doc qui détaille un peu comment ça marche ?
    Le principe du errno c'est "si un appel système plante => errno est mis à jour avec la cause de l'échec".
    Donc il est inutile de le mettre à 0 puisque si l'appel système réussi on se fout de sa valeur.
    J'ai regardé la doc de shmget et effectivement les flags aujourd'hui sont ceux de stat. SHM_R et SHM_W n'existent plus sur Linux.

    Donc si je comprends bien, t'as memId qui ne vaut pas "-1" mais memAddr qui vaut NULL.
    Vérifie
    - le type de memId (si par hasard il est "unsigned" je te tue)
    - le type et la valeur de key (d'ailleurs comment tu génères "key" ?)
    - le type et la valeur de memSize
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. problème avec shmat
    Par laracroft87 dans le forum Linux
    Réponses: 4
    Dernier message: 14/04/2010, 01h27
  2. problème avec shmat
    Par dinamed dans le forum Linux
    Réponses: 2
    Dernier message: 02/05/2007, 16h49
  3. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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