De l'APUE
Les FIFO peuvent être utilisés pour dupliquer un flux de sortie dans une série de commandes shell
. Cela empêche d'écrire les données sur un fichier
de disque intermédiaire (similaire à l'utilisation de tubes pour éviter les fichiers de disque intermédiaires).Mais alors que les canaux ne peuvent être utilisés que pour des connexions linéaires
entre processus, un FIFO a un nom, il peut donc être utilisé pour
des connexions non linéaires .Considérez une procédure qui doit traiter deux fois un flux d'entrée
filtré.mkfifo fifo1 prog3 < fifo1 & prog1 < infile | tee fifo1 | prog2
Nous créons le FIFO puis démarrons prog3 en arrière-plan, en lisant
à partir du FIFO. Nous démarrons ensuite prog1 et utilisons tee pour envoyer son entrée
à la fois au FIFO et à prog2.
-
Comment un FIFO « duplique-t-il un flux de sortie dans une série de commandes shell » ? N'est-ce pas fait par
tee
au lieu d'un FIFO ? -
Dans l'exemple,
mkfifo fifo1
crée un fichier dans le répertoire courant, etfifo1
semble remplaçable par une lime ordinaire. Alors, quel est l'intérêt d'un FIFO "empêcher l'écriture des données sur un fichier disque intermédiaire" ? -
Que signifient les « connexions linéaires » et les « connexions non linéaires » entre les processus ? Qu'est-ce que cela signifie qu'un FIFO peut être utilisé pour des connexions non linéaires, alors qu'un tube ne peut être utilisé que pour des connexions linéaires entre processus ?
Merci.
Réponse acceptée :
-
APUE indique que "les FIFO peuvent être utilisés pour dupliquer un flux de sortie », cela ne dit pas que les FIFO dupliquent réellement le flux de sortie. Comme vous le soulignez, la duplication est effectuée par
tee
dans l'exemple. -
mkfifo
crée un FIFO, qui est visible en tant que "fichier" dans le répertoire contenant ; mais écrire dans la FIFO n'est pas comme écrire dans un fichier car les données n'atteignent jamais le disque. Les tuyaux, nommés ou non, ne fournissent pas de stockage pour les données, ils fournissent des canaux de communication ; l'extrémité d'écriture d'un tube ne peut pas écrire de données s'il n'y a pas de récepteur, le tube transmet simplement les données, sans les stocker. (Sur la plupart des systèmes, les tuyaux sont soutenu par de petits tampons de noyau, pour améliorer les performances, mais c'est un détail d'implémentation.) -
Les connexions linéaires entre les processus sont des tuyaux qui peuvent être représentés sous forme de graphique linéaire. Dans l'exemple, vous pouvez représenter la dernière ligne comme
infile → prog1 → tee fifo1 → prog3
qui est linéaire, mais si vous essayez de représenter toute la chaîne, en vous réduisant aux éléments de traitement, vous avez besoin
infile → prog1 → prog2 → prog3
qui est non linéaire (il y a un nœud dans le graphe,
prog1
, qui a deux nœuds de sortie).