J'ai un petit problème avec l'un de mes projets.
J'ai essayé de trouver un exemple bien documenté d'utilisation de la mémoire partagée avec fork()
mais sans succès.
Fondamentalement, le scénario est que lorsque l'utilisateur démarre le programme, je dois stocker deux valeurs dans la mémoire partagée: current_path qui est un char * et un file_name qui est également char * .
En fonction des arguments de la commande, un nouveau processus est lancé avec fork()
et ce processus doit lire et modifier la variable current_path stockée dans la mémoire partagée tandis que la variable file_name est en lecture seule.
Existe-t-il un bon tutoriel sur la mémoire partagée avec un exemple de code (si possible) auquel vous pouvez me diriger?
c
linux
fork
shared-memory
bipeur
la source
la source
shmget()
et al. et aussi l'mmap()
approche pure avecMAP_ANON
(akaMAP_ANONYMOUS
) - bien qu'elleMAP_ANON
ne soit pas définie par POSIX. Il existe également POSIXshm_open()
etshm_close()
pour la gestion des objets de mémoire partagée. […shm_unlink()
), alors que les mécanismes utilisantmmap()
nécessitent un fichier etMAP_SHARED
persistent les données (etMAP_ANON
empêche la persistance). Il y a un exemple complet dans la section Justification de la spécification deshm_open()
.Réponses:
Il existe deux approches:
shmget
etmmap
. Je vais en parlermmap
, car c'est plus moderne et flexible, mais vous pouvez jeter un coup d'œil àman shmget
( ou à ce tutoriel ) si vous préférez utiliser les outils à l'ancienne.La
mmap()
fonction peut être utilisée pour allouer des tampons de mémoire avec des paramètres hautement personnalisables pour contrôler l'accès et les autorisations, et pour les sauvegarder avec le stockage du système de fichiers si nécessaire.La fonction suivante crée un tampon en mémoire qu'un processus peut partager avec ses enfants:
Voici un exemple de programme qui utilise la fonction définie ci-dessus pour allouer un tampon. Le processus parent écrira un message, un fork, puis attendra que son enfant modifie le tampon. Les deux processus peuvent lire et écrire la mémoire partagée.
la source
shmget
est une manière vraiment démodée, et certains diraient obsolète, de faire de la mémoire partagée ... Mieux vaut utilisermmap
etshm_open
, des fichiers simples, ou simplementMAP_ANONYMOUS
.Voici un exemple de mémoire partagée:
Pas :
Utilisez ftok pour convertir un chemin et un identifiant de projet en clé IPC System V
Utilisez shmget qui alloue un segment de mémoire partagée
Utilisez shmat pour attacher le segment de mémoire partagée identifié par shmid à l'espace d'adressage du processus appelant
Effectuer les opérations sur la zone mémoire
Détacher à l'aide de shmdt
la source
Ceux-ci sont inclus pour l'utilisation de la mémoire partagée
la source
essayez cet exemple de code, je l'ai testé, source: http://www.makelinux.net/alp/035
la source
shmget
et àshmat
partir d'un processus différent), qui est en quelque sorte le point entier de la mémoire partagée ... = (Voici un exemple mmap:
la source
open
ajoute une surcharge d'E / S de fichier. Utilisezshm_open
plutôt.