Suppression d'un segment de mémoire partagée avec shmctl
Je suis déconcerté par le linux man pages
pour shmctl()
. J'utilise la commande suivante: shmctl (id , IPC_RMID , 0)
pour supprimer un segment partagé. Le man pages
semblent contredire lui-même à propos de la mémoire de la vie.
La les pages de manuel état:
IPC_RMID
Marque le segment à être détruit. Le segment ne sera détruite après le dernier processus détache (c'est à dire, lorsque l'
shm_nattch membre de la structure shmid_ds est égale à zéro). L'
l'appelant doit être le propriétaire ou le créateur, ou être privilégié. Si un segment
a été marqué pour la destruction, puis la (non standard) SHM_DEST drapeau
de la shm_perm.le mode de champ dans la structure de données récupérées
par IPC_STAT.
Si je suis correct, je crois que cela signifie que si vous avez deux processus qui se raccordent à la mémoire partagée, (appelons les Process1
et Process2
), Process1
pourrait créer la mémoire partagée, l'attacher, détacher, de détruire la mémoire partagée, et, finalement, mettre fin. Puis la mémoire continuera d'exister jusqu'à ce que Process2
également se détache.
Est-ce correct?
Deuxièmement, ce que fait cette déclaration dans le man pages
dire:
L'appelant doit veiller à ce qu'un segment est finalement détruit;
sinon, les pages qui ont été blâmés en restera dans la mémoire ou
swap.
De ce fait, il semble comme Process1
car il a marqué le segment de la suppression, il serait nécessaire de bloquer jusqu'à ce que tous les autres processus sont détachés afin d'assurer la mémoire est supprimé. Mais ce qui semble en contradiction avec la déclaration ci-dessus. Je n'ai aucune idée de comment cela sera fait (si c'est censé être fait), donc, si c'est le cas, pourrais-tu expliquer comment je pourrais aller à ce sujet.
source d'informationauteur MrHappyAsthma | 2013-03-24
Vous devez vous connecter pour publier un commentaire.
Votre premier raisonnement est correct. Le segment partagé existe jusqu'à ce que les deux: il est marqué par
IPC_RMID
et dernier processus se détache.Le but de la deuxième fragment est à vous rappeler, que dans une solution utilisant la mémoire partagée, vous devez avoir quelques processus de marquer pour la destruction ou il restera dans la mémoire de permutation pour toujours. Il pourrait être une bonne idée d'utiliser
IPC_RMID
immédiatement après la création de segment.Si vous n'êtes pas sûr que vous avez publié avec succès de la mémoire, vous pouvez utiliser
ipcs
programme à la liste des segments restants.