C Programmation

Mémoire partagée POSIX avec programmation C

Mémoire partagée POSIX avec programmation C
La mémoire partagée POSIX est un cadre pour la communication inter-processus (IPC) spécifié dans les spécifications POSIX. Deux (ou plus) tâches peuvent en lire et écrire dans la zone de mémoire partagée tout en établissant la mémoire partagée. La mémoire partagée POSIX n'impose pas toujours les déboursements de copie, contrairement à d'autres structures IPC (par ex.g., tuyau, douille, etc.), et est souhaitable pour certains programmes.

Appels de mémoire partagée POSIX

Les fonctions de mémoire partagée POSIX se sont concentrées sur le concept UNIX selon lequel l'objet doit être un document lors de l'exécution d'activités d'entrée/sortie sur une entité. Par conséquent, parce que vous récitez et inscrivez dans une entité de mémoire POSIX mutuelle, cette dernière doit être considérée comme un document. Un document mappé en mémoire est une entité de mémoire partagée POSIX. Pour utiliser le shm_open fonction d'appel système en dessous /dev/shm, des documents séparés en mémoire partagée sont générés. Il n'y a que deux appels système de mémoire partagée dédiée de POSIX, shm_open, et shm_unlink, qui sont étroitement liés à l'ouverture et à la dissociation des appels du système de fichiers. le tronquer, mmap, et munmap les appels de framework pour les documents sont utilisés pour effectuer d'autres tâches sur la mémoire partagée POSIX. Il est nécessaire de connecter un programme qui utilise les appels de mémoire partagée POSIX à -lrt.

Les programmes utilisant des appels de mémoire partagée POSIX doivent suivre les étapes suivantes :

Utilisant shm_open(), former un objet de mémoire partagée. Le descripteur de document peut être inversé si la formation de l'objet est réussie.

Avec tronquer(), la taille de l'objet sera fixe.

Avec carte() et MAP_PARTAGÉE, délimiter cet objet dans l'espace d'adressage actuel.

Lire/écrire la mémoire partagée.

Passant par munmap(), délimiter la mémoire partagée.

Utiliser Fermer() fermer l'objet.

À travers shm_unlink(), supprimer l'objet dans la mémoire partagée.

shm_open()

Comme décrit ci-dessus, shm_open() est utilisé pour générer un nouvel objet de mémoire partagée. Il rend l'objet accessible à la procédure appelante en utilisant le descripteur inversé. Voici la définition de cet appel de fonction :

>> Int shm_open( const char *nom, int oflag, mode_t mode);

Le premier paramètre est le nom de l'objet de mémoire partagée. Il s'agit d'une chaîne terminée par le zéro du /Nom type, avec la stipulation qu'aucun autre caractère ne peut être une barre oblique autre que son premier caractère. Oflag est un petit voile créé avec plusieurs des drapeaux précédents par OR-ing, que ce soit via O_RDONLY ou alors O_RDWR. Les paramètres décrits indiquent que son objet de mémoire partagée doit être formé (O_CREAT) lorsqu'il n'existe pas déjà et que l'objet est également disponible pour la lecture et l'écriture (O_RDWR). Le tout dernier argument définit les approbations d'annuaire pour l'objet de mémoire partagée.

shm_unlink()

Shm_unlink() élimine l'entité de mémoire partagée POSIX qui était auparavant développée. Le descripteur de document entier pour l'objet de mémoire partagée est renvoyé via un appel effectif à shm_open(). Comme défini sous le shm_open(), le nom du paramètre est le titre de l'entité de mémoire partagée. Voici la définition de la shm_unlink() une fonction:

>> Int shm_unlink( const char *nom);

tronquer()

Lors du réglage de l'objet, le tronquer() la méthode est supprimée pour configurer la taille de l'entité en octets. La définition de la fonction est la suivante :

>> Int ftruncate( int fd, off_t longueur);

Lors de la construction d'une mémoire POSIX partagée, sa capacité de taille est en effet de zéro octet. Vous pouvez rendre l'entité de mémoire partagée POSIX avec des octets de longueur via tronquer. tronquer donne zéro à l'exécution. tronquer sorties -1 en cas de panne et errno est configuré pour déclencher l'erreur.

mmap()

Finalement, un document mappé en mémoire avec l'entité de mémoire partagée est défini via le mmap() méthode. Ensuite, il produit un pointeur de document mappé en mémoire qui est rejeté pour atteindre l'entité de mémoire partagée. Voici la définition de la mmap() une fonction:

>> Void *mmap ( void *addr, size_t length, int prot, int flags, int fd, off_t offset);

En cela, 'addr' est l'adresse à laquelle il sera mappé. La 'longueur' est la plage de l'entité de mémoire partagée. Les valeurs de prot peuvent différer, mais nous utiliserons PROT READ | PROT ÉCRITURE. Il y a plusieurs drapeaux, mais MAP SHARED est essentiel pour la mémoire partagée. Maintenant, 'fd' est un descripteur de document qui a été obtenu plus tôt. Le décalage est le point où le mappage commence dans l'entité de mémoire partagée ; la valeur de décalage 0 peut également être utilisée. En complément, mmap() renvoie le pointeur vers la position de mappage de l'entité de mémoire partagée.

munmap()

À la position dirigée par addr et obtenir la taille, la longueur, munmap annule le mappage de l'élément de mémoire partagée. Munmap donne 0 à la fin et -1 en cas d'imprécision, auquel cas errno est affecté pour déclencher l'erreur.

>> Void munmap ( void *addr, size_t length);

Exemple : expéditeur et destinataire

Prenons l'exemple de l'expéditeur et du destinataire. L'expéditeur créera un nouvel objet de mémoire partagée avec le nom /shmem-exemple et inscrire trois chiffres dans la mémoire partagée à travers elle. Maintenant, le récepteur peut exposer l'objet de mémoire partagée et réciter les trois chiffres de la mémoire. Nous allons créer trois fichiers avec les noms protocole.h, expéditeur.c, et destinataire.c.

$ protocole tactile.h
$ touch expéditeur.c
$ touch récepteur.c

Ensuite, nous ajouterons le code source ci-dessous aux fichiers 'protocole.h,"expéditeur.c,' et 'récepteur.c.' Maintenant, nous allons tout enregistrer et les fermer.

Maintenant, nous allons compiler et joindre le code ci-dessus en utilisant le mot-clé -lrt séparément pour l'expéditeur.c et récepteur.fichier c. Voici la commande pour le faire :

$ gcc -o expéditeur expéditeur.c -lrt
$ gcc -o récepteur récepteur.c -lrt

Maintenant, nous allons exécuter le code de l'expéditeur en utilisant la commande suivante. La sortie est donnée ci-dessous.

$ ./expéditeur

En exécutant le code de l'expéditeur, l'objet de mémoire partagée a été généré et se trouve sous /dev/shm en utilisant la commande ci-dessous :

$ ls -l /dev/shm | grep shmem-exemple

Lorsque nous exécutons le code du récepteur, nous obtenons la sortie ci-dessous :

$ ./destinataire

Chaque fois que la fonction gm_unlink() est appelé en utilisant le fichier 'receiver.c,' l'objet /dev/shm/shmem-exemple sera détaché. Dans ce cas, vous n'obtiendrez aucun objet en sortie, comme indiqué ci-dessous.

$ ls -l /dev/shm/shmem-exemple

Conclusion

Dans cet article, vous avez appris à utiliser la mémoire partagée POSIX avec la programmation C dans Ubuntu 20.04, y compris chaque appel de fonction utilisé pour établir la mémoire partagée. J'espère que cet article vous a aidé à améliorer vos connaissances en programmation et a couvert tous vos doutes à ce sujet.

Bataille pour Wesnoth 1.13.6 Développement publié
Bataille pour Wesnoth 1.13.6 publiée le mois dernier, est la sixième version de développement de la 1.13.x series et il apporte un certain nombre d'am...
Comment installer League Of Legends sur Ubuntu 14.04
Si vous êtes fan de League of Legends, alors c'est l'occasion pour vous de tester League of Legends. Notez que LOL est pris en charge sur PlayOnLinux ...
Installez le dernier jeu de stratégie OpenRA sur Ubuntu Linux
OpenRA est un moteur de jeu de stratégie en temps réel libre/gratuit qui recrée les premiers jeux Westwood comme le classique Command & Conquer: Red A...