Présentation des canaux nommés sur le shell Bash
Sur les systèmes d’exploitation basés sur Linux et Unix, les pipes sont très utiles car ils constituent un moyen simple d’obtenir IPC (communication inter-processus). Lorsque nous connectons deux processus dans un pipeline, la sortie du premier est utilisée comme entrée du second. Pour construire un tube dit « anonyme », tout ce que nous avons à faire est d’utiliser l’opérateur |. Les canaux anonymes ou sans nom durent aussi longtemps que les processus qu’ils connectent. Il existe cependant un autre type de tuyau que nous pouvons utiliser : un FIFO, ou tuyau nommé. Dans cet article, nous allons voir comment fonctionnent les tuyaux nommés et en quoi ils sont différents des tuyaux standard.
Dans ce tutoriel, vous allez apprendre :
- Qu’est-ce qu’un tuyau nommé
- Comment créer un tube nommé
- Comment reconnaître un canal nommé
- Fonctionnement des canaux nommés
- Comment supprimer un tube nommé
Présentation des canaux nommés sur le shell Bash
Configuration logicielle requise et conventions utilisées
Petit rappel du fonctionnement des tuyaux
Dans un tutoriel précédent, nous avons déjà vu comment fonctionnent les pipes et à quoi elles peuvent être utilisées dans l’introduction aux redirections shell, mais faisons juste un bref récapitulatif. Sur nos scripts ou dans nos sessions shell interactives, nous pouvons utiliser l’opérateur pipe (|) pour connecter deux processus ensemble, de sorte que la sortie standard (stdout) du processus sur le côté gauche du tube soit utilisée comme entrée standard (stdin) du processus sur le côté droit de celui-ci. Voici une démonstration rapide et triviale :
echo "goot" | tr 't' 'd'
good
Dans l’exemple ci-dessus, la sortie de la commande echo est utilisée comme entrée standard de la commande tr. Pour ceux d’entre vous qui ne le savent pas, la commande tr peut être utilisée pour traduire ou supprimer des caractères : ici, nous l’avons utilisée pour substituer toutes les occurrences du caractère t par le caractère d. Le résultat des deux commandes reliées ensemble dans ce qu’on appelle un pipeline, est la chaîne « good ».
Ce que nous avons utilisé dans l’exemple ci-dessus s’appelle un tube sans nom. Ce type de tube n’existe que jusqu’à ce que les commandes soient exécutées et n’est pas accessible par la suite. Si nous voulons construire un tuyau et pouvoir le référencer après son utilisation
nous devons utiliser les tuyaux nommés et voyons ce qu’ils sont et comment ils fonctionnent.
Qu’est-ce qu’un tuyau nommé ?
Sur les systèmes d’exploitation basés sur Unix comme Linux, un pipe nommé, ou FIFO (first-in, first-out), est un type de fichier « spécial » utilisé pour établir une connexion entre les processus. Contrairement à un tube « standard », un tube nommé est accessible dans le cadre du système de fichiers, comme tout autre type de fichier. Une fois créé, un tube nommé apparaîtra en effet comme un fichier standard ; Cependant, il apparaîtra toujours vide, car il ne sera pas utilisé pour « stocker » des informations. Les données qui passeront par le pipe seront gérées directement par le noyau : le fichier FIFO ne servira que de référence.
Création d’un tube nommé
Pour créer un tube nommé, dans les systèmes d’exploitation modernes basés sur Linux, tout ce que nous avons à faire est d’utiliser la commande mkfifo. Dans son utilisation la plus basique, tout ce que nous avons à passer en argument au programme est le nom que nous voulons utiliser pour le fichier FIFO. Pour
, pour créer un tube nommé appelé pipe0, nous exécuterions :
mkfifo pipe0
Si vous le souhaitez, un tube nommé peut également être créé avec un ensemble spécifique de permissions à l’aide de l’option -m (abréviation de --mode) de la commande mkfifo. L’option accepte les bits d’autorisation de fichier comme argument, donc par exemple, pour créer un tube named
avec 644 permissions, nous exécuterions :
mkfifo -m 644 pipe0
Jetons un coup d’œil au fichier qui a été créé à la suite de l’exécution de la commande ci-dessus :
ls -l pipe0
prw-r--r--. 1 egdoc egdoc 0 Dec 15 11:55 pipe0
Ici, nous avons exécuté la commande ls avec l’option -l, de sorte que le format de liste longue ait été utilisé. Dans la sortie de la commande, nous pouvons voir que la première lettre qui apparaît avant les bits de permissions est un p : cela indique que
le fichier est bien un pipe nommé.
Utilisation d’un tube nommé
Nous savons comment fonctionnent les tuyaux « standard » : la sortie standard du processus à gauche du tuyau | est utilisée comme entrée standard de celui à sa droite. Les canaux nommés fonctionnent de la même manière. Démontrons-le. La première chose que nous voulons faire
est d’écrire quelque chose dans le tube nommé. Pour ce faire, nous pouvons utiliser une simple redirection ; Nous ouvrons un nouvel émulateur de terminal et nous exécutons la commande suivante :
echo "input message" > pipe0
Quelque chose d’apparemment inattendu se produit dès que nous appuyons sur Entrée : la commande semble se bloquer. Cela est dû au fonctionnement des canaux nommés : pour que les données soient transmises à travers un canal nommé, le fichier FIFO doit être ouvert aux deux extrémités, par un processus qui y écrit, et par au moins un qui veut lire à partir de celui-ci.
Dans ce cas, puisqu’il n’y a rien qui « lise » le tuyau et « consomme » son contenu, on dit que le tuyau est bloqué. Pour le démontrer, ouvrons un autre émulateur de terminal et utilisons la commande cat pour « lire » à partir du tube nommé :
cat pipe0
input message
Comme vous pouvez le voir, le message que nous avons écrit au tube nommé a été imprimé à l’écran et sur le terminal que nous avons utilisé pour écrire dans le tuyau, tout est rentré dans l’ordre (la commande ne se bloque plus, et l’invite du shell apparaît à nouveau). Comme vous pouvez le voir dans le clip ci-dessous, la même chose se produit si nous ouvrons d’abord le tuyau pour la lecture, et qu’il n’y a rien d’écrit dessus :
Encore une fois, rien n’est réellement écrit sur le fichier pipe0, et une fois que le contenu d’un tube nommé est « consommé », le tube est effacé. L’un des avantages des canaux nommés par rapport aux canaux standard est que les processus d’écriture et de lecture n’ont pas besoin de démarrer en même temps.
Suppression d’un tube nommé
Étant donné qu’un tube nommé n’est qu’un fichier, pour en supprimer un, en supposant que nous avons les bonnes autorisations pour effectuer l’action, nous pouvons utiliser la commande rm. Pour supprimer le tuyau que nous avons créé dans les exemples précédents, nous allons donc exécuter :
rm pipe0
Conclusions
Dans cet article, nous avons appris comment fonctionnent les pipes nommés sous Linux. Nous avons vu comment ils sont accessibles dans le cadre du système de fichiers, car ils semblent être comme n’importe quel autre fichier. Nous avons vu comment créer des pipes nommées à l’aide de la commande mkfifo, quelles sont leurs particularités
, et un exemple de leur utilisation. Enfin, nous avons vu comment supprimer un pipe nommé.
