Il est temps de discuter de la mise en œuvre d'un exemple simple de communication basée sur une file de messages.
Vous pouvez donc télécharger le code source à partir de cette URL GitHub et vous devez aller dans ce répertoire.
A l'intérieur de ce répertoire, vous trouverez deux fichiers C, à savoir les émetteurs et les récepteurs.
Je vais donc vous montrer comment les processus d'envoi et de réception peuvent communiquer entre eux en utilisant
la file d'attente de messages comme IPC.
Vous pouvez donc télécharger le code comme suit en utilisant la commande git clone.
Cette commande va vous permettre de télécharger le répertoire IPC sur votre machine locale.
Assurez-vous que votre machine Linux est connectée à l'internet.
Dans ce répertoire IPC, vous trouverez un répertoire de file d'attente de messages, dans
lequel vous trouverez les fichiers sender et receiver dot c qui implémentent le processus d'envoi
et de réception.
J'ai donc divisé la fenêtre en deux fenêtres sur le côté gauche.
Essayons de comprendre le code du processus d'envoi qui est le sandboxie.
Vous pouvez donc constater que la mise en œuvre est relativement limitée.
Vous pouvez donc voir sur le côté gauche que j'ai un processus de ponçage.
Le processus de ponçage a donc besoin d'une mémoire appelée tampon dans laquelle il stocke d'abord les
données à envoyer au processus de réception.
C'est vrai ?
Le processus d'envoi demande donc à l'utilisateur de saisir la chaîne, qui sera utilisée par le processus de
ponçage pour envoyer des données au processus de réception.
Ici, le processus de ponçage consiste simplement à demander à l'utilisateur d'entrer une chaîne de caractères.
Le droit et l'endroit où ce processus de ponçage obtiendra l'ID de la file d'attente de messages du processus de réception.
Ainsi, lorsque nous lancerons ce processus, nous transmettrons l'ID du message du processus de réception en
tant qu'argument de la ligne de commande d'exécution.
C'est vrai.
Comme nous le savons, en C, l'argument de la ligne de commande d'exécution est stocké dans ce tableau.
Vous pouvez donc constater que si le nombre d'arguments transmis est inférieur à un, cela signifie que l'utilisateur
n'a pas transmis l'ID de message du processus de réception et que ce processus affiche donc une erreur indiquant qu'il s'attend
à ce que l'ID de message soit transmis en tant qu'argument d'exécution.
Notez donc toujours que le processus d'envoi doit connaître l'ID du message du processus de réception afin que le processus d'envoi
puisse envoyer des données au processus de réception à l'aide d'une file d'attente de messages.
Ainsi, à la ligne 30, nous supposons que nous avons fourni l'argument de ligne de commande à ce processus.
Ce processus ouvrira donc simplement la file d'attente des messages.
Le nom de la file d'attente de messages est bien sûr stocké dans ce tableau d'arguments de la ligne de commande.
Ce processus ouvre en fait la file d'attente des messages en mode écriture uniquement, car tout ce qu'il a besoin de faire
est d'envoyer un message au processus destinataire en utilisant la file d'attente des messages et l'argument restant peut être
passé comme null null.
À ce stade, le processus a donc réussi à ouvrir une file d'attente de messages.
Le processus a également reçu avec succès l'entrée de l'utilisateur à l'aide de l'instruction Scanf.
La dernière chose que fait ce processus est donc d'envoyer les données au processus de réception à l'aide de l'API d'envoi de la file d'attente
de messages.
Une fois que le processus a envoyé avec succès les données au processus destinataire, il ferme simplement la file
d'attente des messages et se termine.
Vous pouvez donc constater que la mise en œuvre du processus d'envoi est relativement simple.
De même, dans la fenêtre de droite.
Examinons la mise en œuvre de la procédure de réception.
La mise en œuvre du processus de réception est donc également assez simple.
Ainsi, lorsque nous lançons ce processus de réception, nous fournissons à nouveau l'argument de ligne de commande comme nom de
l'identifiant de message en utilisant cet identifiant de message.
Ce processus de réception va créer sa propre file d'attente de messages.
C'est vrai.
Nous définissons ici les attributs de la file d'attente de messages.
Nous ne définissons donc que deux attributs de la file d'attente de messages.
Il s'agit de la taille maximale du message qui peut être placé dans la file d'attente et du nombre maximal de messages
qui peuvent être mis en file d'attente dans une file d'attente.
Maintenant, après avoir spécifié les attributs de la file d'attente de messages à la ligne 36, le processus de réception peut simplement
créer une file d'attente de messages à l'aide de l'API d'ouverture de file d'attente de messages.
Le premier argument de cette API est donc l'argument de la ligne de commande, qui est en fait une chaîne ou un identifiant
de file d'attente de messages fourni par l'utilisateur.
Et comme il s'agit d'un processus de réception, il suffit que ce processus ouvre une file d'attente de messages en
mode lecture seule.
C'est vrai ?
Ce processus peut définir certaines autorisations pour sa file d'attente de messages.
Le dernier argument fourni à l'API d'ouverture de la file d'attente de messages est le pointeur vers les attributs que nous venons de
définir avant d'invoquer l'API d'ouverture de la file d'attente de messages.
C'est-à-dire que ces attributs et les permissions peuvent toujours être utilisés comme 0660.
Ici, nous avons également pris la variable set, dans laquelle nous allons stocker le descripteur de fichier de la file d'attente
des messages.
Notre processus de réception entre donc dans une boucle infinie.
La première chose que fait ce processus de réception est donc d'effacer tous les descripteurs de fichiers présents
dans cette structure de données.
Ensuite, il suffit d'ajouter le descripteur de fichier de la file d'attente de messages que le processus de réception vient de
créer dans cette structure de données.
C'est vrai.
Désormais, le processus peut simplement invoquer l'appel système select.
Dès que le processus invoque l'appel système select, il est bloqué ici.
Ce processus de réception restera bloqué au niveau de l'appel système select jusqu'à ce qu'un processus d'envoi place les données
dans cette file d'attente de messages.
C'est vrai.
Dans ce cas, l'appel système select ne sera débloqué que lorsque le processus d'envoi placera les données dans la file d'attente
des messages.
Nous vérifions donc ici que c'est bien le descripteur de fichier de la file d'attente des messages qui est activé, n'est-ce
pas ?
Le descripteur de fichier de la file d'attente des messages sera activé lorsqu'un processus d'envoi placera les données dans la file d'attente
des messages.
Cette condition sera vraie lorsque le processus de ponçage aura placé les données dans la file d'attente des messages.
La prochaine chose que doit faire le processus de réception est donc de retirer les données de la file d'attente des messages.
Le retrait des données de la file d'attente des messages s'effectue à l'aide de l'API de réception.
Le processus de réception a lu les données de la file d'attente des messages et les données sont ensuite
copiées dans ce tampon, qui est en fait un tampon vide dans l'espace mémoire fourni par le processus de réception.
Pour copier les données de la file d'attente des messages.
Après avoir retiré les données de la file d'attente des messages, le processus de réception se contente d'imprimer le message
récupéré dans la file d'attente.
Ensuite, le processus de réception retourne à la boucle while one, vide à nouveau la structure de données set, réinitialise
le descripteur de fichier dans la structure de données set et se bloque à nouveau sur l'appel système select.
En d'autres termes, il attend maintenant que le prochain élément de données soit prélevé dans la file d'attente des messages.
Vous pouvez donc constater que le code de l'expéditeur et du processus de réception qui communiquent en utilisant la
file d'attente de messages comme mécanisme de communication inter-processus est assez simple.
Essayons donc d'exécuter ce programme et voyons ce qu'il en est.