web-dev-qa-db-fra.com

Exemple d'utilisation de canaux nommés dans Linux Bash

Quelqu'un peut-il publier un exemple simple d'utilisation de canaux nommés dans Bash sous Linux?

51
Drew LeSueur

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

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

Un autre comportement utile consiste à utiliser netcat comme 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 démarre un serveur nc sur le port 12345 et toutes les connexions sont redirigées vers 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 canal nommé pour rediriger l'entrée et la sortie.

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

Ouvrez deux coquilles différentes et laissez-les côte à côte. Dans les deux cas, accédez à /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 donnera aucune invite tant que vous n'aurez pas exécuté la deuxième partie du code dans le second shell. C'est parce que la lecture et l'écriture de fifo bloquent.

Vous pouvez également consulter le type 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!

29
Nicolas Mas

Voici les commandes:

$ mkfifo named_pipe

$ echo "Hi" > named_pipe &

$ cat named_pipe

La première commande crée le tuyau.

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

La dernière commande lit à partir du tuyau.

27
Khaled

Terminal 1:

$ mknod new_named_pipe p
$ echo 123 > new_named_pipe
  • Le terminal 1 a créé un canal nommé.
  • Il y a écrit des données en utilisant l'écho.
  • Il est bloqué car il n'y a pas de fin de réception (car les canaux nommés et non nommés doivent y recevoir et y écrire)

Terminal 2:

$ cat new_named_pipe
$ 123
$ 
  • Depuis le terminal 2, une extrémité de réception pour les données est ajoutée.
  • Il a lu les données qu'il contient en utilisant cat.
  • Étant donné que les deux extrémités de réception et d'écriture sont là pour le new_named_pipe il affiche les informations et les arrêts de blocage

Les canaux nommés sont utilisés partout dans Linux, la plupart des fichiers de caractères et de blocs que nous voyons pendant ls -l commande sont des canaux char et block (tous ces éléments résident dans/dev). Ces tuyaux peuvent être bloquants et non bloquants, et le principal avantage est qu'ils fournissent le moyen le plus simple pour IPC.

2
Chaitanya Tetali