Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Shared Memory (IPC, shmget)

9 réponses
Avatar
Cedric DUFOUIL
Bonjour,

J'ai un probleme avec un de mes programmes utilisant de la mémoire
partagé sous MacOS (Xserve G5).

Voici où ça cloche :

__________
segmentId = shmget(IPC_PRIVATE, nbHost*sizeof(int),
IPC_CREAT|S_IRUSR|S_IWUSR);
if(segmentId == -1){
cout << "[FATAL] Can not create shared memory ... " << endl;
cout << strerror(errno) << endl;
exit(1);
}
__________

Tout fonctionne parfaitement, seulement si mon programme ferme avant
d'avoir libéré cette memoire et que je le relance, j'obtiens :

__________
[FATAL] Can not create shared memory ...
No space left on device
__________

(Il semble que MacOS soit plus avare en memoire partagé par défaut que
les Linux)

Or ipcs ne me dit rien :
__________
cdufouil@tartopom23:$ ipcs
Message Queues:
T ID KEY MODE OWNER GROUP

Shared Memory:
T ID KEY MODE OWNER GROUP

Semaphores:
T ID KEY MODE OWNER GROUP

cdufouil@tartopom23:$
__________

Comment puis-je libérer cette mémoire sans rebooter la machine ?

Merci.

Cédric.

PS : Sous linux, il n'y a pas ce probleme, ipcs m'indique la mémoire
allouée, et je peux la libérer à la main.
PS2 : Je n'ai pas les droits admin pour augmenter la memoire utilisable
ou rebooter la machine.

9 réponses

Avatar
Saïd
Cedric DUFOUIL :
Bonjour,

J'ai un probleme avec un de mes programmes utilisant de la mémoire
partagé sous MacOS (Xserve G5).

Voici où ça cloche :

__________
segmentId = shmget(IPC_PRIVATE, nbHost*sizeof(int),
IPC_CREAT|S_IRUSR|S_IWUSR);
if(segmentId == -1){
cout << "[FATAL] Can not create shared memory ... " << endl;
cout << strerror(errno) << endl;
exit(1);
}
__________

Tout fonctionne parfaitement, seulement si mon programme ferme avant
d'avoir libéré cette memoire et que je le relance, j'obtiens :

__________
[FATAL] Can not create shared memory ...
No space left on device
__________



1) faire en sorte que la memoire soit liberee dans tous les cas par le
programme. (une routine a appeler dans tous les points de sortie possibles).
ou bien
2) donner une cle differente de IPC_PRIVATE qui permettrait de reutiliser la
memoire deja allouee.


--
Saïd.
"Bless this, O Lord, that with it thou mayst blow thine enemies to tiny
bits, in thy mercy."
In the Book of Armaments, Chapter 4. (The Holy Hand Grenade)

Avatar
Cedric DUFOUIL
Bonjour,

Merci pour tes réponses.

Saïd wrote:

1) faire en sorte que la memoire soit liberee dans tous les cas par le
programme. (une routine a appeler dans tous les points de sortie possibles).
ou bien


Effectivement, mais comme le programme est en développement, je ne suis
pas à l'abris d'un segmentation fault :(


2) donner une cle differente de IPC_PRIVATE qui permettrait de reutiliser la
memoire deja allouee.


J'ai pensé faire ça. Et je vais le faire ...

Mais la machine me refuse toute nouvelle allocation (limite atteinte).
Suis-je obliger de la rebooter (faire la demande aupres de
l'administrateur) ?

Avatar
Cedric DUFOUIL
J'ai réussit grace à la méthode "bourin" ...

for(segmentId = 1; segmentId > 0;segmentId++){
if(shmctl(segmentId, IPC_RMID, 0)==0)
cout << "Shared Memory " << segmentId << " successfully deleted";
}


Maintenant que j'ai pu libérer ma memoire partagée, je vais prendre
toujours le meme id.

Merci pour vos réponses.
Avatar
Eric Levenez
Le 21/09/06 14:25, dans <eeu0i0$ikl$, « Cedric DUFOUIL »
a écrit :

J'ai un probleme avec un de mes programmes utilisant de la mémoire
partagé sous MacOS (Xserve G5).

Voici où ça cloche :

__________
segmentId = shmget(IPC_PRIVATE, nbHost*sizeof(int),
IPC_CREAT|S_IRUSR|S_IWUSR);
if(segmentId == -1){
cout << "[FATAL] Can not create shared memory ... " << endl;
cout << strerror(errno) << endl;
exit(1);
}
__________

Tout fonctionne parfaitement, seulement si mon programme ferme avant
d'avoir libéré cette memoire et que je le relance, j'obtiens :

__________
[FATAL] Can not create shared memory ...
No space left on device
__________

(Il semble que MacOS soit plus avare en memoire partagé par défaut que
les Linux)


Perso, j'utilise une clé donnée par ftok() et pas IPC_PRIVATE, et aucun
problème sous Mac OS X pour la réutilisation de la mémoire partagée (sauf si
elle a changé de taille bien sûr).

Or ipcs ne me dit rien :


Il faut être root pour utiliser ipcs sur Mac OS X
__________
:$ ipcs
Message Queues:
T ID KEY MODE OWNER GROUP

Shared Memory:
T ID KEY MODE OWNER GROUP

Semaphores:
T ID KEY MODE OWNER GROUP

:$


eric$ sudo ipcs
Password:
Message Queues:
T ID KEY MODE OWNER GROUP

Shared Memory:
T ID KEY MODE OWNER GROUP
m 131071 1297368149 --rw-rw-rw- eric eric

Semaphores:
T ID KEY MODE OWNER GROUP

Comment puis-je libérer cette mémoire sans rebooter la machine ?


eric$ sudo ipcrm -M 1297368149
eric$ sudo ipcs
Message Queues:
T ID KEY MODE OWNER GROUP

Shared Memory:
T ID KEY MODE OWNER GROUP

Semaphores:
T ID KEY MODE OWNER GROUP

PS : Sous linux, il n'y a pas ce probleme, ipcs m'indique la mémoire
allouée, et je peux la libérer à la main.


Ici aussi, mais il faut être root.

PS2 : Je n'ai pas les droits admin pour augmenter la memoire utilisable
ou rebooter la machine.


Cela va compliquer les choses.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
filh
Cedric DUFOUIL wrote:

Bonjour,

Merci pour tes réponses.

Saïd wrote:

1) faire en sorte que la memoire soit liberee dans tous les cas par le
programme. (une routine a appeler dans tous les points de sortie possibles).
ou bien


Effectivement, mais comme le programme est en développement, je ne suis
pas à l'abris d'un segmentation fault :(


2) donner une cle differente de IPC_PRIVATE qui permettrait de reutiliser la
memoire deja allouee.


J'ai pensé faire ça. Et je vais le faire ...

Mais la machine me refuse toute nouvelle allocation (limite atteinte).
Suis-je obliger de la rebooter (faire la demande aupres de
l'administrateur) ?


man ipcrm
man ipcs

Commandes shell qui vont bien. Attention dans certains cas et certains
OS il faut être root pour voir certaines ipc allouées avec des perms
foireuses.

Sinon pour le message d'erreur ATTENTION, l'implémentation des IPC est
pour le moins facétieuse et les errno retournés sont une basse
réutilisation des errno de la gestion d'E/S fichier.

Il faut donc revoir le man pour réinterpréter la chose car le message
affiché n'a parfois qu'un rapport je dirais... lointain avec la cause.

Enfin, je veux pas dire, mais.. les IPC c'est has been :) Use Posix !
(Bon chais pas sous Mac OSX mais sur Solaris par exemple il me semble
que les shm IPC sont implémentées au dessus de la mémoire partagée
Posix)

FiLH


--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org


Avatar
Cedric DUFOUIL
Eric Levenez wrote:

Perso, j'utilise une clé donnée par ftok() et pas IPC_PRIVATE, et aucun
problème sous Mac OS X pour la réutilisation de la mémoire partagée (sauf si
elle a changé de taille bien sûr).


Je vais me renseigner sur ftok() ...


Or ipcs ne me dit rien :


Il faut être root pour utiliser ipcs sur Mac OS X


Ah ! Mais je peux pas avoir d'acces root sur cette machine.


Merci pour toutes vos réponses.

Avec la boucle que j'ai indiqué précedemmment, j'ai pu libérer ma
mémoire partagé, et maintenant, c'est bon, je vais réutiliser toujours
la meme zone memoire, ça m'évitera d'avoir à recommencer.


Avatar
Cedric DUFOUIL
FiLH wrote:
Cedric DUFOUIL wrote:

Bonjour,

Merci pour tes réponses.

Saïd wrote:

1) faire en sorte que la memoire soit liberee dans tous les cas par le
programme. (une routine a appeler dans tous les points de sortie possibles).
ou bien
Effectivement, mais comme le programme est en développement, je ne suis

pas à l'abris d'un segmentation fault :(


2) donner une cle differente de IPC_PRIVATE qui permettrait de reutiliser la
memoire deja allouee.
J'ai pensé faire ça. Et je vais le faire ...


Mais la machine me refuse toute nouvelle allocation (limite atteinte).
Suis-je obliger de la rebooter (faire la demande aupres de
l'administrateur) ?


man ipcrm
man ipcs

Commandes shell qui vont bien. Attention dans certains cas et certains
OS il faut être root pour voir certaines ipc allouées avec des perms
foireuses.


Apparemment, il est là le probleme ... Il faut etre root.


Enfin, je veux pas dire, mais.. les IPC c'est has been :) Use Posix !
(Bon chais pas sous Mac OSX mais sur Solaris par exemple il me semble
que les shm IPC sont implémentées au dessus de la mémoire partagée
Posix)


Je ne suis pas expert en ipc, mais un shmget, c'est pas posix ?
Si non, quel est son équivalent posix ?

Merci.



Avatar
Eric Levenez
Le 22/09/06 8:44, dans <ef00t6$2v9$, « Cedric DUFOUIL »
a écrit :

FiLH wrote:

Enfin, je veux pas dire, mais.. les IPC c'est has been :) Use Posix !


Je ne suis pas expert en ipc, mais un shmget, c'est pas posix ?


Bien sûr que si c'est Posix IEEE Std 1003.1.

Son ancien nom était IPC System V, maintenant c'est XSI IPC.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
filh
Eric Levenez wrote:

Le 22/09/06 8:44, dans <ef00t6$2v9$, « Cedric DUFOUIL »

FiLH wrote:

Enfin, je veux pas dire, mais.. les IPC c'est has been :) Use Posix !


Je ne suis pas expert en ipc, mais un shmget, c'est pas posix ?


Bien sûr que si c'est Posix IEEE Std 1003.1.

Son ancien nom était IPC System V, maintenant c'est XSI IPC.


Ma foi, j'ai fait confiance à des docs, faudra que je vois ça.

Sinon pour répondre à la question intéressante, une autre méthode pour
faire de la mémoire partagée est de faire un mmap avec le flag SHARED.

Attention là encore on peut avoir quelques différences suivant les OS.
On peut avoir besoin de lier le mmap à un fichier existant et de la
taille qui va bien (et de créer le fichier avec un ftruncate) ou dans
d'autre cas il semble que faire le mmap sur /dev/null puisse fonctionner
(je crois l'avoir lu, je ne l'ai pas expérimenté).

FiLH

--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org