Quel est le but d'utiliser une FIFO par rapport à un fichier temporaire ou à un canal?

1

De 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 dans un fichier disque intermédiaire (similaire à l'utilisation de tubes pour éviter les fichiers disque intermédiaires).

Cependant, alors que les tubes ne peuvent être utilisés que pour des connexions linéaires entre processus, une FIFO a un nom et peut donc être utilisée pour des connexions non linéaires .

Considérons une procédure qui doit traiter un flux d'entrée filtré deux fois.

mkfifo fifo1
prog3 < fifo1 &
prog1 < infile | tee fifo1 | prog2

Nous créons la FIFO puis commençons prog3 en arrière-plan, en lisant à partir de la FIFO. Nous commençons ensuite prog1 et utilisons tee pour envoyer son entrée à la fois au FIFO et au prog2.

  1. Comment une FIFO "duplique-t-elle un flux de sortie dans une série de commandes shell"? N'est-ce pas fait par teeau lieu d'un FIFO?

  2. Dans l'exemple, mkfifo fifo1crée un fichier dans le répertoire en cours et fifo1semble remplaçable par un fichier normal. Alors, quel est l'intérêt d'une FIFO "d'empêcher l'écriture des données dans un fichier disque intermédiaire"?

  3. Que signifient "connexions linéaires" et "connexions non linéaires" entre processus? Qu'est-ce que cela signifie qu'un FIFO peut être utilisé pour des connexions non linéaires, alors qu'un tuyau ne peut être utilisé que pour des connexions linéaires entre processus?

Merci.

Tim
la source

Réponses:

5
  1. APUE indique que «les FIFO peuvent être utilisés pour dupliquer un flux de sortie», il ne dit pas que les FIFO dupliquent en réalité le flux de sortie. Comme vous le soulignez, la duplication est effectuée teedans l'exemple.

  2. mkfifocrée une FIFO, visible sous forme de «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 canaux, nommés ou non, ne fournissent pas de stockage pour les données, ils fournissent des canaux de communication; l'écriture d'un tuyau ne peut pas écrire de données s'il n'y a pas de récepteur, le tuyau ne fait que transmettre des données sans les stocker. (Sur la plupart des systèmes, les canaux sont protégés 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 tubes pouvant être représentés sous forme de graphique linéaire. Dans l'exemple, vous pouvez représenter la dernière ligne en tant que

    infile → prog1 → tee fifo1 → prog3
    

    qui est linéaire, mais si vous essayez de représenter la chaîne entière, en réduisant au traitement des éléments, vous avez besoin

    infile → prog1 → prog2
                   → prog3
    

    qui est non linéaire (il y a un nœud dans le graphique prog1, qui a deux nœuds de sortie).

Stephen Kitt
la source
Merci. (2) Quel est l'avantage d'une FIFO par rapport à un fichier régulier temporaire? (3) La connexion non linéaire entre les processus est effectivement mise en œuvre par teeune FIFO, par exemple, en utilisant teeun fichier régulier temporaire, nous pouvons également réaliser la même connexion non linéaire.
Tim
La description dans APUE oppose d’une part les FIFO et les fichiers, d’autre part les FIFO et les pipes; vous ne pouvez pas confondre les trois. Lorsque l'on compare des fichiers FIFO et des fichiers FIFO, la différence est que les fichiers FIFO n'impliquent pas de frapper le disque pour le contenu écrit dans la mémoire FIFO (cela concerne votre point 2). Lors de la comparaison de FIFO et de canaux, la différence est que les FIFO sont nommés et peuvent donc être utilisés dans des endroits où les tubes ne peuvent pas. APUE ne dit pas que vous ne pouvez pas utiliser de fichiers pour implémenter des connexions non linéaires, il dit simplement que vous ne pouvez pas utiliser de canaux.
Stephen Kitt
Merci. Quel est l'avantage de "n'implique pas de frapper le disque pour le contenu écrit sur la FIFO"?
Tim
Les disques sont lents. (Du moins, ils l'étaient quand APUE a été écrit.)
Stephen Kitt
Merci. Outre la vitesse, je m'interroge également sur l'espace. Les canaux nommés (utilisés dans la substitution de processus et la FIFO) résident-ils dans la mémoire principale? Un canal nommé doit-il contenir tout le contenu en tant que fichier temporaire sur le disque lorsqu'il utilise le fichier au lieu d'un canal nommé? La mémoire principale doit-elle être suffisamment grande si le contenu est énorme?
Tim