75 votes

Exemple d'utilisation de named pipes dans Linux Bash

Quelqu'un peut-il poster un exemple simple d'utilisation de named pipes dans Bash sous Linux ?

101voto

Brian Clements Points 1840

Un des meilleurs exemples d'utilisation pratique d'un tuyau nommé...

De http://en.wikipedia.org/wiki/Netcat :

Un autre comportement utile consiste à utiliser netcat comme un proxy. Les ports et les hôtes peuvent être redirigés. Regardez cet exemple :

nc -l 12345 | nc www.google.com 80

Le port 12345 représente la demande.

Cela lance un nc sur le port 12345 et toutes les connexions sont redirigées sur google.com:80 . Si un navigateur web fait une demande à nc la demande sera envoyée à google mais la réponse ne sera pas envoyée au navigateur web. C'est parce que les tuyaux sont unidirectionnels. Cela peut être contourné avec un tuyau nommé pour rediriger l'entrée et la sortie.

mkfifo backpipe
nc -l 12345  0<backpipe | nc www.google.com 80 1>backpipe

43voto

Khaled Points 593

Voici les commandes :

$ mkfifo named_pipe

$ echo "Hi" > named_pipe &

$ cat named_pipe

La première commande crée le pipe.

La deuxième commande écrit sur le tuyau (blocage). Le site & met cela en arrière-plan pour que vous puissiez continuer à taper des commandes dans le même shell. Il se termine lorsque la FIFO est vidée par la commande suivante.

La dernière commande lit à partir du tuyau.

35voto

Nicolas Mas Points 41

Ouvrez deux coquilles différentes, et laissez-les côte à côte. Dans les deux, allez dans le /tmp/ répertoire :

cd /tmp/

Dans le premier type :

mkfifo myPipe
echo "IPC_example_between_two_shells">myPipe

Dans le second, tapez :

while read line; do echo "What has been passed through the pipe is ${line}"; done<myPipe

Le premier shell ne vous renverra pas d'invite tant que vous n'aurez pas exécuté la seconde partie du code dans le second shell. C'est parce que le fifo read and write est bloquant.

Vous pouvez également voir le type de FIFO en faisant un ls -al myPipe et voir les détails de ce type de fichier spécifique.

La prochaine étape serait d'embarquer le code dans un script !

2voto

Terminal 1 :

$ mknod new_named_pipe p
$ echo 123 > new_named_pipe
  • Le terminal 1 a créé un tuyau nommé.
  • Il y a écrit des données en utilisant echo.
  • Il est bloqué car il n'y a pas d'extrémité de réception (car les tuyaux nommés et non nommés ont besoin d'extrémités de réception et d'écriture).

Terminal 2 :

$ cat new_named_pipe
$ 123
$ 
  • A partir du terminal 2, on ajoute une extrémité de réception des données.
  • Il lit les données qu'il contient en utilisant le chat.
  • Puisque les deux extrémités de réception et d'écriture sont là pour la new_named_pipe il affiche les informations et bloque les arrêts

Les pipes nommés sont utilisés partout dans Linux, la plupart des fichiers char et block que nous voyons pendant ls -l sont des tuyaux char et block (Tous ces tuyaux résident sur /dev). Ces tuyaux peuvent être bloquants ou non bloquants, et leur principal avantage est qu'ils fournissent le moyen le plus simple pour l'IPC.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X