Question

Est-ce que quelqu'un sait comment bash gère l'envoi de données via des tuyaux ?

cat file.txt | tail -20

Cette commande imprime-t-elle tout le contenu du fichier.txt dans un tampon, qui est ensuite lu par tail ?Ou est-ce que cette commande, par exemple, imprime le contenu de file.txt ligne par ligne, puis s'arrête à chaque ligne pour que tail soit traité, puis demande plus de données ?

La raison pour laquelle je demande est que j'écris un programme sur un périphérique intégré qui effectue essentiellement une séquence d'opérations sur un morceau de données, où la sortie d'une opération est envoyée comme entrée de l'opération suivante.J'aimerais savoir comment Linux (bash) gère cela, alors donnez-moi une réponse générale, pas spécifiquement ce qui se passe lorsque j'exécute "cat file.txt | tail -20".

Merci d'avance pour vos réponses !

MODIFIER:Shog9 a souligné un article Wikipédia pertinent, cela ne m'a pas conduit directement à l'article mais cela m'a aidé à trouver ceci : http://en.wikipedia.org/wiki/Pipeline_%28Unix%29#Implementation qui contenait les informations que je recherchais.


Je suis désolé de ne pas avoir été clair.Bien sûr, vous utilisez un tube et bien sûr vous utilisez stdin et stdout des parties respectives de la commande.J'avais pensé que c'était trop évident pour le dire.

Ce que je demande, c'est comment cela est géré/mis en œuvre.Puisque les deux programmes ne peuvent pas s'exécuter en même temps, comment les données sont-elles envoyées de stdin à stdout ?Que se passe-t-il si le premier programme génère des données beaucoup plus rapidement que le deuxième programme ?Le système exécute-t-il simplement la première commande jusqu'à ce qu'elle soit terminée ou que son tampon stdout soit plein, puis passe au programme suivant, et ainsi de suite en boucle jusqu'à ce qu'il ne reste plus de données à traiter ou existe-t-il un mécanisme plus compliqué ? ?

Était-ce utile?

La solution

J'ai décidé d'écrire une explication légèrement plus détaillée.

La « magie » réside ici dans le système d’exploitation.Les deux programmes démarrent à peu près au même moment et s'exécutent en même temps (le système d'exploitation leur attribue des tranches de temps sur le processeur pour s'exécuter) comme tout autre processus exécuté simultanément sur votre ordinateur (y compris l'application de terminal et le noyau). .Ainsi, avant que des données ne soient transmises, les processus effectuent l'initialisation nécessaire.Dans votre exemple, tail analyse l'argument '-20' et cat analyse l'argument 'file.txt' et ouvre le fichier.À un moment donné, tail arrivera au point où il aura besoin d'une entrée et indiquera au système d'exploitation qu'il attend une entrée.À un autre moment (avant ou après, cela n'a pas d'importance), cat commencera à transmettre des données au système d'exploitation à l'aide de la sortie standard.Cela va dans un tampon du système d’exploitation.La prochaine fois que tail obtient une tranche de temps sur le processeur après que certaines données ont été placées dans le tampon par cat, il récupérera une partie de ces données (ou la totalité) qui quittent le tampon sur le système d'exploitation.Lorsque le tampon est vide, à un moment donné, tail devra attendre que cat génère plus de données.Si cat produit des données beaucoup plus rapidement que tail ne les gère, le tampon se développera.cat finira par produire des données, mais tail sera toujours en cours de traitement, donc cat se fermera et tail traitera toutes les données restantes dans le tampon.Le système d'exploitation signalera la fin lorsqu'il n'y aura plus de données entrantes avec un EOF.Tail traitera les données restantes.Dans ce cas, tail reçoit probablement simplement toutes les données dans un tampon circulaire de 20 lignes, et lorsque le système d'exploitation lui signale qu'il n'y a plus de données entrantes, il vide ensuite les vingt dernières lignes vers sa propre sortie standard, ce qui s'affiche simplement dans le terminal.Puisque tail est un programme beaucoup plus simple que cat, il passera probablement la plupart du temps à attendre que cat mette les données dans le tampon.

Sur un système doté de plusieurs processeurs, les deux programmes ne partageront pas seulement des tranches de temps alternées sur le même cœur de processeur, mais fonctionneront probablement en même temps sur des cœurs distincts.

Pour entrer un peu plus en détail, si vous ouvrez une sorte de moniteur de processus (spécifique au système d'exploitation) comme « top » sous Linux, vous verrez toute une liste de processus en cours d'exécution, dont la plupart utilisent effectivement 0 % du processeur.La plupart des applications, à moins qu’elles ne traitent des données, passent la plupart de leur temps à ne rien faire.C'est une bonne chose, car cela permet aux autres processus d'avoir un accès illimité au processeur en fonction de leurs besoins.Cela se fait essentiellement de trois manières.Un processus pourrait accéder à une instruction de style sleep(n) dans laquelle il dit essentiellement au noyau d'attendre n millisecondes avant de lui donner une autre tranche de temps avec laquelle travailler.Le plus souvent, un programme doit attendre quelque chose d'un autre programme, comme « tail » en attendant que plus de données entrent dans le tampon.Dans ce cas, le système d'exploitation réveillera le processus lorsque davantage de données seront disponibles.Enfin, le noyau peut préempter un processus en cours d'exécution, donnant ainsi des tranches de temps processeur à d'autres processus.'cat' et 'tail' sont des programmes simples.Dans cet exemple, tail passe la majeure partie de son temps à attendre plus de données sur le tampon, et cat passe la majeure partie de son temps à attendre que le système d'exploitation récupère les données du disque dur.Le goulot d'étranglement est la vitesse (ou la lenteur) du support physique sur lequel le fichier est stocké.Ce délai perceptible que vous pourriez détecter lorsque vous exécutez cette commande pour la première fois est le temps qu'il faut aux têtes de lecture du lecteur de disque pour rechercher la position sur le disque dur où se trouve « fichier.txt ».Si vous exécutez la commande une deuxième fois, le système d'exploitation aura probablement le contenu du fichier.txt mis en cache en mémoire et vous ne verrez probablement aucun retard perceptible (sauf si le fichier.txt est très volumineux ou si le fichier n'est plus mis en cache). .)

La plupart des opérations que vous effectuez sur votre ordinateur sont liées aux E/S, ce qui signifie que vous attendez généralement que les données proviennent de votre disque dur, d'un périphérique réseau, etc.

Autres conseils

Shog9 a déjà fait référence à l'article Wikipédia, mais le section de mise en œuvre a les détails que vous souhaitez.L'implémentation de base est un tampon limité.

cat imprimera simplement les données sur la sortie standard, qui seront redirigées vers l'entrée standard de tail.Cela peut être vu dans la page de manuel de bash.

En d'autres termes, il n'y a pas de pause, tail lit simplement depuis l'entrée standard et cat écrit simplement vers la sortie standard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top