Fonction shmget 2 c

Fonction shmget 2 c
La fonction shmget () est utilisée pour créer une nouvelle file d'attente de messages ou pour accéder à une nouvelle file d'attente. La mémoire partagée fait partie des méthodes de communication inter-processus qui permet à deux processus ou plus d'échanger rapidement les données et de communiquer dans l'espace utilisateur. La mémoire partagée fait référence lorsque de nombreux processus accèdent à la même région de mémoire et peuvent lui modifier ou y accéder au besoin. Pour clarifier, chaque processus a son adresse mémoire; Si un processus souhaite transmettre les données de sa mémoire système aux autres processus, seuls les mécanismes IPC de communication inter-processus sont disponibles.

La communication peut se produire entre les systèmes connectés ou sans rapport, car nous sommes tous conscients. La méthode d'appel SHMGET System est utilisée pour établir un nouveau segment de mémoire partagé ou localiser un segment existant à l'aide d'une clé. Les segments de mémoire partagés sont des sections de mémoire accessibles par plusieurs processus et qui, une fois établies, restent disponibles jusqu'à ce qu'ils soient explicitement détruits avec la fonction SHMCTL. Cet article vous montrera comment utiliser la fonction d'appel système Shmget dans le langage C pour allouer la mémoire partagée de diverses manières.

Syntaxe de la fonction d'appel du système Shmget dans le langage C

int shmget (touche key_t, size_t size, int shmflg);

Ici, nous avons une syntaxe générale de la fonction d'appel du système SHMGET. Il y a différents paramètres passés dans la fonction shmget. Ces paramètres sont expliqués en détail dans la discussion suivante.

La valeur de la touche de paramètre est renvoyée par shmget () qui renvoie le segment de mémoire partagé d'identification du système V. Si la clé est IPC privée ou non IPC privé, aucun segment de mémoire partagé équivalent à la clé n'existe, et le CREAT IPC n'est défini en SHMFLG, une nouvelle segmentation de mémoire partagée avec une taille équivalente à la valeur de la taille à l'échelle jusqu'à un multiple à un multiple La taille de la page est produite. (Ceci est similaire à l'effet ouvert (2) de O Creat | o excl).

La taille nécessaire du segment est spécifiée par l'argument de taille. Si le segment se produit actuellement, la taille ne peut pas dépasser la taille fournie lors de sa création. En outre, pour définir quels utilisateurs sont autorisés à accéder ou à modifier le segment de la mémoire, l'un des bits d'autorité, s iwusr, s irgrp, s iwgrp, s iroth et s iwoth peut être fourni.

Exemple

L'exemple de code montre comment utiliser les fonctions d'appel système SHMGET et SHMAT dans un seul processus pour créer un nouveau segment partagé et ensuite écrire du texte dedans. L'exemple de code montre également que les processus multiples peuvent transmettre à l'aide de la mémoire collective.

#inclure
#inclure
#inclure
#inclure
#inclure
#inclure
#inclure
#inclure
enum segment_size = 0x6400;
const char * data = "hey, là!"
int main (int argc, char * argv [])
statut int;
int segment_id;
segment_id = shmget (ipc_private, segment_size,
Ipc_creat | Ipc_excl | S_irusr | S_iwusr);
char * sh_mem = (char *) shmat (segment_id, 0, 0);
printf ("segment id% d \ n", segment_id);
printf ("joint à% p \ n", sh_mem);
MemMove (sh_mem, data, strlen (data) +1);
printf ("% s \ n", sh_mem);
pid_t child_pid = fork ();
if (child_pid == -1)
Perror ("Fork");
if (child_pid == 0)
strcpy (sh_mem, "Nouvelles données dans Child Process \ 0");
printf ("enfant pid:% d \ n", getPid ());
exit (exit_success);
autre
pid_t ret = waitPid (child_pid, & status, wunttrace | wContinued);
if (ret == -1)
Perror ("WaitPid");
if (femmexited (statut))
printf ("Statut of Child Offite:% d \ n", wexitstatus (statut));
if (wexitstatus (status) == 0)
printf ("% s \ n", sh_mem);

shmdt (sh_mem);
shmctl (segment_id, ipc_rmid, 0);
exit (exit_success);

Tout d'abord, nous avons inclus des fichiers d'en-tête applicables. La capacité de mémoire partagée est définie dans le «SYS / SHM.Fichier d'en-tête h ”. Commencez par l'implémentation du code. Nous avons défini la taille du segment en utilisant la méthode ENUM. La variable est déclarée comme les données où la chaîne est initialisée. Ensuite, nous avons l'appel de fonction principale. Dans la fonction principale de cet exemple, les variables sont définies et initialisées. Le segment_id est initialisé avec la méthode shmget. La clé du segment de mémoire est le premier des trois arguments transmis à la méthode shmget. Si un nouveau segment doit être établi, la valeur clé peut être la macro privée IPC ou la valeur clé d'un segment existant si l'appel doit obtenir l'identification de la mémoire.

La taille du segment est spécifiée par le deuxième argument et les drapeaux d'autorisation, qui peuvent être OR-ed pour ajouter des valeurs possibles, sont spécifiés par le troisième argument de Shmget.

L'identifiant du segment est reçu après la formation du segment de mémoire, et il peut ensuite être envoyé à la fonction SHMAT pour connecter le segment de mémoire. Comme deuxième entrée à Shmat, l'utilisateur peut spécifier l'adresse où le segment de mémoire doit être joint. Pourtant, il est plus courant de permettre au noyau de déterminer l'adresse et d'utiliser Null pour indiquer que. La fonction printf imprime la valeur de l'ID du segment et la mémoire partagée jointe et imprime la chaîne «hey, there».

Le processus principal «PID_T» des fourches et un processus d'enfant «Child_pid» sont générés, chacun enregistrant une chaîne distincte dans la même adresse. En attendant, le processus parent s'arrête et attend que l'enfant se termine puis part avec un code réussi. La chaîne nouvellement enregistrée est écrite sur la console. Si de nombreux processus doivent modifier et acquérir les segments de mémoire partagés en même temps, les techniques de synchronisation telles que les sémaphores doivent être utilisées.

L'exécution du code précédent génère une sortie comme celle-ci. L'ID de segment est généré, l'adresse de mémoire partagée s'affiche et la chaîne est également imprimée sur l'invite. L'enfant PID et le statut de l'enfant qui sont sortis sont générés avec le message, «Nouvelles données dans le processus de l'enfant».

Conclusion

Nous avons parcouru la fonction d'appel du système Shmget dans ce post. La fonction shmget () récupère l'identification de la mémoire partagée de la clé. Grâce à la fonction d'appel système SHMGET, nous pouvons obtenir la mémoire partagée. Avant de pouvoir utiliser la fonction shmget (), nous devons importer de nombreuses bibliothèques. Cette fonction contient les paramètres qui contrôlent une variété de fonctions. Cet article vous aide à améliorer vos compétences en programmation et à résoudre les problèmes que vous avez peut-être eu sur la fonction d'appel du système Shmget.