Dans this thread, il est suggéré à l'OP d'utiliser mmap()
au lieu de shmget()
pour obtenir de la mémoire partagée sous Linux. J'ai visité la page this et la page this pour obtenir de la documentation, mais la seconde donne un exemple obscur concernant mmap()
.
Étant presque un débutant et ayant besoin de partager des informations (sous forme de texte) entre deux processus, devrais-je utiliser la méthode shmget()
ou mmap()
? Et pourquoi?
Les deux méthodes sont viables. La méthode mmap
est un peu plus restrictive que shmget
, mais elle est plus facile à utiliser. shmget
est l'ancien modèle de mémoire partagée System V et dispose du support le plus large. mmap
/shm_open
est le nouveau moyen POSIX de créer de la mémoire partagée et est plus facile à utiliser. Si votre système d'exploitation permet l'utilisation de la mémoire partagée POSIX, je vous conseillerais de continuer avec cela.
Quelques astuces:
fork
alors mmap
avec MAP_ANONYMOUS | MAP_SHARED
est de loin le moyen le plus simple - un seul appel. MAP_ANONYMOUS
est cependant une extension Linux non spécifié par POSIX .shm_open
(+ ftruncate
) + mmap
avec MAP_SHARED
est deux/trois appels. Nécessite librt
sur certains systèmes d’exploitation./dev/shm/
puis shm_open
équivaut à ouvrir un fichier dans /dev/shm/
.Cela tient en grande partie à l’histoire et aux orientations futures.
Il était une fois deux versions principales (et quelque peu concurrentes) de Unix - System V et BSD. SysV disposait de ses propres versions d'IPC, notamment de la grande mémoire partagée, des sémaphores et des files d'attente de messages. POSIX est venu pour essayer d'unir les choses.
Nous avons donc actuellement deux versions: la mémoire partagée posix, les MQ, les sémaphores et les versions sysV. Juste pour rendre les choses un peu plus confuses, les versions de sysV font aussi partie de posix.
Donc, fondamentalement, votre question est: voulez-vous utiliser la mémoire partagée de style Posix ou SysV? En général, la plupart des gens adoptent une vision à long terme et optent pour Posix parce que cela semble être la voie de l'avenir. Mais, de façon réaliste, le contenu sysV est tellement intégré dans tant de systèmes que vous devez avoir des doutes sérieux sur le fait que cela va disparaître.
Donc, en éliminant les problèmes à long terme, il faut déterminer ce qui convient à votre projet et à vos goûts. En général, les versions de sysV ont tendance à être un peu plus puissantes, mais elles ont une interface maladroite que la plupart des gens trouvent un peu déroutante au premier contact. Ceci est particulièrement vrai des sémaphores sysV et des files de messages. En termes de mémoire partagée, on peut dire que sysV et posix sont maladroits. Les versions de sysV portent le maladroit ftok
et les éléments clés tandis que le posix prend plusieurs appels et certaines conditions de concurrence à configurer. De l'extérieur, les versions posix ont l'avantage d'utiliser le système de fichiers et peuvent être gérées avec des fonctions de ligne de commande standard telles que 'rm' plutôt que de s'appuyer sur des programmes utilitaires distincts (par exemple, ipcs
) requis par sysV.
Alors, lequel devriez-vous utiliser? En règle générale, les versions posix. Mais vous devriez vraiment vous familiariser avec les versions de sysV. Certaines de leurs fonctionnalités vont au-delà des fonctionnalités des versions posix, dont vous pouvez tirer parti dans certaines situations.