GNU/Linux >> Tutoriels Linux >  >> Linux

Le but d'utiliser un Fifo Vs un fichier temporaire ou un tuyau ?

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.

  1. 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 ?

  2. Dans l'exemple, mkfifo fifo1 crée un fichier dans le répertoire courant, et fifo1 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" ?

  3. 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 :

  1. 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.

  2. 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.)

  3. 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).

Connexe :Comment créer une nouvelle fenêtre sur le répertoire courant dans tmux ?
Linux
  1. Utilisation de Google Drive à partir de la ligne de commande Linux

  2. Quel est le but du fichier .bashrc sous Linux

  3. Quelle est la différence de rediriger une sortie en utilisant >, &>, >&et 2&> ?

  4. emplacement du fichier temporaire lors de l'utilisation de tmpfile() en C

  5. Pipe doit-il écrire un fichier temporaire?

Utilisation du fichier de configuration SSH

Comment surveiller la progression des données dans un tube à l'aide de la commande "pv"

Télécharger un fichier avec wget en utilisant plusieurs connexions

Comment insérer du texte à la 1ère ligne d'un fichier à l'aide de sed ?

Comment changer l'encodage utilisé par mon serveur SFTP ?

Accidentellement utilisé la redirection de sortie > au lieu d'un tube |