Introduction aux tuyaux nommés sur Bash Shell

Introduction aux tuyaux nommés sur Bash Shell

Sur les systèmes d'exploitation basés sur Linux et Unix, les tuyaux sont très utiles car ils sont un moyen simple de réaliser IPC (communication interprocessus). Lorsque nous connectons deux processus dans un pipeline, la sortie du premier est utilisée comme entrée du second. Pour construire un soi-disant tuyau «anonyme», tout ce que nous avons à faire est d'utiliser le | opérateur. Les tuyaux 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 verrons comment fonctionnent les tuyaux nommés et dans ce qu'ils sont différents des tuyaux standard.

Dans ce tutoriel, vous apprendrez:

  • Qu'est-ce qu'un tuyau nommé
  • Comment créer un tuyau nommé
  • Comment reconnaître un tuyau nommé
  • Comment fonctionnent les tuyaux nommés
  • Comment supprimer un tuyau nommé
Introduction aux tuyaux nommés sur Bash Shell

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Distribution indépendante
Logiciel Les utilitaires utilisés dans ce tutoriel sont disponibles par défaut
Autre Permissions racinaires pour effectuer des tâches administratives
Conventions # - nécessite que les commandes Linux sont exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux sont exécutées en tant qu'utilisateur non privilégié régulier

Un rappel rapide de la façon dont les tuyaux fonctionnent

Dans un tutoriel précédent, nous avons déjà vu comment fonctionnent les tuyaux et pour quoi ils peuvent être utilisés dans l'introduction aux redirections de coquille, mais faisons simplement un récapitulatif rapide. Sur nos scripts ou dans nos séances de coquille interactives, nous pouvons utiliser l'opérateur de tuyau (|) pour connecter deux processus ensemble, de sorte que la sortie standard (stdout) du processus sur le côté gauche du tuyau est 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' bon 

Dans l'exemple ci-dessus, la sortie du écho La commande est utilisée comme entrée standard du tr un. Pour ceux d'entre vous qui ne savent pas, le tr La commande peut être utilisée pour traduire ou supprimer des caractères: ici, nous l'avons utilisé pour remplacer toutes les occurrences du t caractère avec le d un. Le résultat des deux commandes a été conduite ensemble dans ce qu'on appelle un pipeline, La chaîne est-elle «bonne».

Ce que nous avons utilisé dans l'exemple ci-dessus est appelé un pipe sans nom. Un tel type de tuyau n'existe que jusqu'à l'exécution des commandes et ne peut pas être accessible par la suite. Si nous voulons construire un tuyau et pouvoir le référencer après son utilisation
Nous devons utiliser le soi-disant Pipes nommés, Voyons ce qu'ils sont et comment ils fonctionnent.



Qu'est-ce qu'un tuyau nommé?

Sur un système d'exploitation basé sur UNIX comme Linux, un tuyau nommé, ou Fifo (First-in, First-Out), est un type de fichier «spécial» utilisé pour établir une connexion entre les processus. Contrairement à un tuyau «standard», un tuyau nommé est accessible dans le cadre du système de fichiers, comme tout autre type de fichier. Une fois créé, un tuyau nommé apparaîtra en effet comme un fichier standard; Cependant, il semblera toujours vide, car il ne sera pas utilisé pour «stocker» les informations. Les données qui passeront à travers le tuyau seront gérées directement par le noyau: le Fifo Le fichier sera simplement utilisé comme référence.

Créer un tuyau nommé

Créer un tuyau nommé, Dans les systèmes d'exploitation modernes basés sur Linux, tout ce que nous devons faire est d'utiliser le mkfifo commande. Dans son utilisation la plus élémentaire, tout ce que nous devons passer comme argument au programme est le nom que nous voulons utiliser pour le Fifo déposer. Pour
Instance, pour créer un tuyau nommé appelé pipe0, Nous courions:

$ mkfifo pipe0 

Si vous le souhaitez, un tuyau nommé peut également être créé avec un Ensemble spécifique d'autorisations en utilisant le -m Option (abréviation pour --mode) de la mkfifo commande. L'option accepte le Bits d'autorisation de fichier comme argument, donc par exemple, pour créer un nommé
tuyau avec 644 Autorisations, nous courions:

$ mkfifo -m 644 pipe0 

Jetons un coup d'œil au fichier créé à la suite de l'exécution de la commande ci-dessus:

$ ls -l pipe0 prw-r - r--. 1 egdoc egdoc 0 déc 15 11:55 Pipe0 

Ici, nous avons dirigé le LS commande avec le -l option, de sorte que le format d'inscription long a été utilisé. Dans la sortie de la commande, nous pouvons voir que la première lettre qui apparaît avant les bits des autorisations est un p: Cela indique que
Le fichier est en effet un tuyau nommé.



Utilisation d'un tuyau nommé

Nous savons comment fonctionnent les tuyaux «standard»: la sortie standard du processus à gauche du tuyau | est utilisé comme entrée standard de celui à sa droite. Les tuyaux nommés fonctionnent de la même manière. Voyons-le. La première chose que nous voulons
faire est d'écrire quelque chose sur le tuyau 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 "Message d'entrée"> PIPA0 

Quelque chose apparemment inattendu se produit dès que nous appuyons sur Entrée: la commande semble suspendre. Cela est dû au fonctionnement des tuyaux nommés: pour que les données soient passées par un tuyau nommé, le Fifo Le fichier doit être ouvert aux deux extrémités, par un processus qui lui écrit, et par au moins un qui veut lire.

Dans ce cas, comme il n'y a rien de «lire» du tuyau et de «consommer» son contenu, nous disons que le tuyau est bloqué. Pour démontrer cela, ouvrons un autre émulateur de terminal et utilisons le chat commande de «lire» à partir du tuyau nommé:

$ Cat Pipe0 Message d'entrée 

Comme vous pouvez le voir, le message que nous avons écrit au tuyau nommé a été imprimé à l'écran et sur le terminal que nous avons utilisé pour écrire sur le tuyau, tout est de retour à la normale (la commande n'est plus suspendue, et l'invite de coque apparaît à nouveau). Comme vous pouvez le voir dans le clip ci-dessous, la même chose se produit si nous ouvrons le tuyau pour la lecture pour la première fois, et rien n'écrit:

Encore une fois, rien n'est réellement écrit sur le pipe0 fichier, et une fois que le contenu d'un tuyau nommé est «consommé», le tuyau est effacé. L'un des avantages des tuyaux nommés sur des tuyaux standard est que les processus de l'écrivain et des lecteurs n'ont pas à commencer en même temps.



Suppression d'un tuyau nommé

Puisqu'un tuyau 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 le RM commande. Pour retirer le tuyau que nous avons créé dans les exemples précédents, nous courions donc:

$ rm pipe0 

Conclusions

Dans cet article, nous avons appris comment Pipes nommés travailler sur 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 tuyaux nommés en utilisant le mkfifo commande, quoi
sont leur particularité et un exemple de leur utilisation. Enfin, nous avons vu comment supprimer un tuyau nommé.

Tutoriels Linux connexes:

  • Gestion de la saisie des utilisateurs dans les scripts bash
  • Choses à installer sur Ubuntu 20.04
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Comment configurer vsftpd sur Debian
  • Comment lancer des processus externes avec Python et le…
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Masterring Bash Script Loops
  • Script bash: opérateur unaire attendu
  • Comment propager un signal aux processus d'enfants à partir d'un bash…
  • Système linux hung? Comment s'échapper vers la ligne de commande et…