POSIX partage la mémoire avec la programmation C

POSIX partage la mémoire avec la programmation C
La mémoire partagée POSIX est un cadre pour la communication interprète (IPC) spécifiée dans les spécifications POSIX. Deux tâches (ou plus) peuvent le 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'applique pas toujours les débours de copie, contrairement aux autres structures IPC (E.g., tuyau, douille, etc.), et est souhaitable pour certains programmes.

POSIX PARTAYÉ CAPLES DE MÉMOIRE

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 une entité de mémoire Mutual POSIX, ce dernier doit être considéré comme un document. Un document cartographié à la 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 de mémoire partagés séparés sont générés. Il n'y a que deux appels système de mémoire partagés dédiés de POSIX, shm_open, et shm_unlink, qui sont étroitement liés aux appels du système de fichiers d'ouverture et de non-être. Le ftruncate, mmap, et munmap Les appels de framework pour des 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 des appels de mémoire partagés POSIX pour -TLR.

Les programmes utilisant des appels de mémoire partagés POSIX doivent passer par les étapes suivantes:

En utilisant shm_open (), former un objet de mémoire partagé. Le descripteur de document peut être reversé si la formation de l'objet réussit.

Avec ftruncate (), La taille de l'objet sera fixe.

Avec carte() et Map_shared, Délimitez cet objet dans le présent espace d'adressage.

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

Via Munmap (), Déliailer la mémoire partagée.

Utiliser fermer() Pour 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é. Il rend l'objet accessible à la procédure d'appel à l'aide du descripteur resté. Ce qui suit est la définition de cet appel de fonction:

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

Le premier paramètre est le nom de l'objet de mémoire partagé. C'est une chaîne à terminaison nulle du /nom Tapez, avec la stipulation qu'aucun autre personnage 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 O_RDWR. Les paramètres décrits indiquent que son objet partagé doit être formé (O_Creat) lorsqu'il n'existe pas déjà et que l'objet est disponible pour la lecture et l'écriture (O_RDWR). Le tout dernier argument définit les approbations du répertoire pour l'objet partagé.

shm_unlink ()

Shm_unlink () élimine l'entité mémoire partagée POSIX qui a été autrefois développée. Le descripteur de document entier de l'objet partagé est renvoyé via un appel efficace 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. Ce qui suit est la définition du shm_unlink () fonction:

>> int shm_unlink (const char * name);

ftruncate ()

En définissant l'objet, le ftruncate () La méthode est rejeté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, il est en effet nulle d'octets de taille. Vous pouvez rendre l'entité mémoire partagée POSIX avec des octets de longueur de taille via ftruncat. Ftruncat donne zéro à l'exécution. Ftruncat sorties -1 en cas d'échec et errer est défini pour déclencher l'erreur.

mmap ()

Finalement, un document mappé par la mémoire avec l'entité partagée est définie via le mmap () méthode. Ensuite, il donne un pointeur de document à mémoire de mémoire qui est retiré pour atteindre l'entité partagée. Ce qui suit est la définition du mmap () fonction:

>> void * mmap (void * addr, size_t longueur, int prot, int int draps, 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 PRTT peuvent différer, mais nous utiliserons la lecture de Prot | Prot écriture. Il y a plusieurs drapeaux, mais la carte partagée est essentielle 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 () donne le pointeur vers la position de mappage de l'entité de mémoire partagée.

Munmap ()

À la position dirigée par addr et obtenant la taille, la longueur, munmap Unmaps l'élément de mémoire partagée. Munmap donne 0 à la fin et -1 dans la situation de l'inexactitude, auquel cas Errno est affecté pour déclencher l'erreur.

>> void munmap (void * addr, size_t longueur);

Exemple: expéditeur et récepteur

Prenons l'exemple de l'expéditeur et du récepteur. L'expéditeur créera un nouvel objet partagé 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 à mémoire partagée et réciter les trois chiffres de la mémoire. Nous créerons trois fichiers avec les noms protocole.H, expéditeur.c, et destinataire.c.

Protocole $ touch.H
$ Touch Expéditeur.c
$ récepteur Touch.c

Ensuite, nous ajouterons le code source ci-dessous au protocole de fichiers.H, "expéditeur.c, 'et' récepteur.c.'Maintenant, nous allons tout sauver et les fermerons.

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

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

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

$ ./expéditeur

Exécutant le code de l'expéditeur, l'objet de mémoire partagé a été généré et peut être trouvé en dessous / dev / shm Utilisation de la commande ci-dessous:

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

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

$ ./destinataire

Chaque fois que la fonction gm_unlink () est appelé en utilisant le fichier 'récepteur.c, 'l'objet / dev / shm / shmem-exemple sera détaché. Dans ce cas, vous n'obtiendrez aucun objet sur la 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 une mémoire partagée. J'espère que cet article vous a aidé à améliorer vos connaissances en programmation et a couvert tous les doutes que vous avez sur ce sujet.