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 :

[IPC] libération segment mémoire partagée


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Par défaut [IPC] libération segment mémoire partagée
    Bonjour,

    Je bosse en ce moment sur des IPC, notamment sur la mémoire partagée. J'aurais voulu savoir comment faire pour effacer un segment de mémoire, mais sans le supprimer. C'est à dire qu'il existerait toujours, mais il serait vide. Cela est-il possible sans le supprimer (shmctl avec IPC_RMID) et le recréer ?

    Merci d'avance pour votre aide.

  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 joyled Voir le message
    Bonjour,

    Je bosse en ce moment sur des IPC, notamment sur la mémoire partagée. J'aurais voulu savoir comment faire pour effacer un segment de mémoire, mais sans le supprimer. C'est à dire qu'il existerait toujours, mais il serait vide. Cela est-il possible sans le supprimer (shmctl avec IPC_RMID) et le recréer ?

    Merci d'avance pour votre aide.
    Ca ne sert à rien de "vider" une mémoire. Si tu la gères bien, tu écris ce qu'il faut où il faut et tu récupères plus tard ce qui a été écrit car tu sais où ça a été écrit.
    D'ailleurs de façon plus générale, le concept" vider" n'existe pas en informatique. Une zone mémoire contient toujours du zéro ou du un donc elle n'est jamais "vide".

    Maintenant si tu veux exprimer la notion de vide dans le sens "je ne sais pas qui a rempli cette zone mais j'ai besoin de savoir jusqu'où elle a été remplie" alors il te faut établir une convention que tous tes programmes, toutes tes fonctions respecteront. Tout comme une string en C qui n'est qu'une suite d'octets terminée par un '\0', tu peux faire la même chose mais c'est à toi de le programmer. Dans ce cas, "vider" ta zone consistera à y mettre le caractère spécial (qui peut être '\0') au tout début.
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Par défaut
    D'accord, merci pour l'éclaircissement.

    Autre question concernant la mémoire partagée :
    mettons que dans ma mémoire partagée je veux qu'il y ait 3 cases mémoires contenant des entiers et 20 contenant des structures définies par moi-même.

    typedef struct {
    int premier;
    int second;
    } structure;
    structure *exemple;

    Lors de la création je fais :

    memoire=shmget(cle,taille,0666|IPC_CREAT);

    avec taille=3*sizeof(int)+20*sizeof(structure)


    Ma question se porte sur la suite : comment préciser dans quelle case je veux écrire ?
    Par exemple, si je veux écrire ou accéder à une case contenant un entier, il faudra que je m'y attache :

    exemple=(structure*)shmat(memoire,NULL,0)

    et si je veux accéder à une case contenant une structure, il faudra que j'écrive :

    exemple=(int*)shmat(memoire,NULL,0)

    Est-ce bien comme ça, ou suis-je complètement à côté ?

    Comment écrire précisément dans une case donnée ?

    Merci !

  4. #4
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par joyled Voir le message
    Ma question se porte sur la suite : comment préciser dans quelle case je veux écrire ?
    Par exemple, si je veux écrire ou accéder à une case contenant un entier, il faudra que je m'y attache :

    exemple=(structure*)shmat(memoire,NULL,0)

    et si je veux accéder à une case contenant une structure, il faudra que j'écrive :

    exemple=(int*)shmat(memoire,NULL,0)
    J'espère que tu voulais exprimer l'inverse.


    Sache que les segments de memoire partagée sont des pointeurs. Tu peux les utiliser comme un tableau. Il suffit de récupérer l'@ de ton segment avec shmat.
    Par exemple, dans ton cas, tu sais que les 3 premières cases de ton segment sont des entiers (les elts d'indice 0,1,2). Donc pour ecrire/lire dans ton segment tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int *data;
     
    *data = (int *) exemple[0];
    // et ainsi de suite
    Tu fais idem pour ta structure.

    Mais je me demande si on peut mettre 2 types différents dans un meme segment de mémoire partagé?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Par défaut
    Oui, je voulais bien sûr écrire l'inverse

    Donc il faut bien s'attacher des deux façons ?

    Je vais tester avec ce que tu m'as proposé et je reviendrai.

    Et je pense que oui, on peut mettre deux types différents dans une mémoire partagée.

  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 publicStaticVoidMain Voir le message
    Sache que les segments de memoire partagée sont des pointeurs.
    ...
    Mais je me demande si on peut mettre 2 types différents dans un meme segment de mémoire partagé?
    Ben évidemment puisque tu l'as dit toi-même, ce sont des pointeurs => il n'y a pas de notion de type dans les data écrites => elles sont écrites octet par octet...
    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]

  7. #7
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben évidemment puisque tu l'as dit toi-même, ce sont des pointeurs => il n'y a pas de notion de type dans les data écrites => elles sont écrites octet par octet...
    Ben merci pour l'éclaircissement, parce que je n'ai jamais tenté ça.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Par défaut
    Donc il faut bien que je m'attache deux fois à la mémoire partagée, une fois pour écrire des entiers, une fois pour rentrer des structures ?

    Par ex, si je veux écrire un pid dans la première case mémoire :

    int pid=getpid();
    int *ptr_pid;
    ptr_pid=&pid;

    exemple=(int*)shmat(memoire,NULL,0);

    *ptr_pid=(int*)exemple[0];

    Ceci devrait marcher, non ?

  9. #9
    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 joyled Voir le message
    Donc il faut bien que je m'attache deux fois à la mémoire partagée, une fois pour écrire des entiers, une fois pour rentrer des structures ?
    Non. Tu attacues une grosse zone et tu écris ton int quelque part et ta structure ailleurs

    Citation Envoyé par joyled Voir le message
    Par ex, si je veux écrire un pid dans la première case mémoire :

    int pid=getpid();
    int *ptr_pid;
    ptr_pid=&pid;

    exemple=(int*)shmat(memoire,NULL,0);

    *ptr_pid=(int*)exemple[0];

    Ceci devrait marcher, non ?
    Euh... oui ça marchouille mais tu t'en sors mal. Te faut gérer ça octet par octet

    Voici un exemple tout simple d'écriture et de lecture dans une shm

    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
    char *shm;
    char *courant;
    int pid=getpid();
    struct s_blablabla ma_structure;
     
     
    shm=shmat(...);
     
    // Ecriture
    courant=shm;
    memcpy(courant, &pid, sizeof(pid));
    courant+=sizeof(pid);
    memcpy(courant, &ma_structure, sizeof(ma_structure));
     
    // Lecture
    courant=shm;
    memcpy(&pid, courant, sizeof(pid));
    courant+=sizeof(pid);
    memcpy(&ma_structure, courant, sizeof(ma_structure));
    Ou alors, si tu ne veux pas te faire ch... à gérer la position, tu peux effectivement utiliser plusieurs shm...
    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]

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Par défaut
    Hem, je ne dois utiliser que du C, or il me semble que memcpy fait partie du C++, si je ne me trompe pas...

  11. #11
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par joyled Voir le message
    Hem, je ne dois utiliser que du C, or il me semble que memcpy fait partie du C++, si je ne me trompe pas...
    Non, memcpy est bien une fonction C.

Discussions similaires

  1. Allocation dans un segment de mémoire partagé
    Par Malek_moly dans le forum C
    Réponses: 7
    Dernier message: 23/04/2012, 20h24
  2. Segmentation fault dans un contexte de mémoire partagée
    Par introdisco dans le forum Débuter
    Réponses: 2
    Dernier message: 05/02/2012, 20h48
  3. Segment de mémoire partagée POSIX, socket et select
    Par Antoine J. dans le forum POSIX
    Réponses: 2
    Dernier message: 06/12/2011, 16h42
  4. Segment de mémoire partagé
    Par dedibox26 dans le forum Débuter
    Réponses: 3
    Dernier message: 13/05/2010, 00h18
  5. [SHM] shmget crée uniquement des segments de mémoire partagée privée
    Par prgasp77 dans le forum Administration système
    Réponses: 1
    Dernier message: 23/09/2009, 08h20

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