4 votes

comment le shell pipe gère la boucle infinie

Lorsque j'ai besoin de limiter la sortie des commandes shell, j'utilise less pour paginer les résultats :

cat file_with_long_content | less

ce qui fonctionne bien et dandy, mais ce que je suis curieux de savoir est, moins fonctionne encore même si la sortie est sans fin, considérer avoir le script suivant dans inf.sh fichier :

while true; do date; done

puis j'exécute

sh inf.sh | less

Et il est encore capable de paginer les résultats, donc est-il correct de dire que pipe diffuse le résultat plutôt que d'attendre la fin de la commande avant de sortir le résultat ?

7voto

adl Points 7294

Oui, lorsque vous exécutez sh inf.sh | less les deux commandes sont exécutées en parallèle. Les données écrites dans le tube par le premier processus sont mises en mémoire tampon (par le noyau) jusqu'à ce qu'elles soient lues par le second. Si la mémoire tampon est pleine (c'est-à-dire si la première commande écrit dans le tube plus vite que la seconde ne peut lire), l'opération d'écriture suivante sera bloquée jusqu'à ce qu'un espace supplémentaire soit disponible. Une condition similaire se produit lors de la lecture d'un tube vide : si le tampon du tube est vide mais que l'extrémité d'entrée est toujours ouverte, une lecture bloquera jusqu'à ce que d'autres données soient disponibles.

Ver el tuyau (7) pour plus de détails.

1voto

uʍop ǝpısdn Points 16540

C'est correct. Les tuyaux sont des ruisseaux .

Vous pouvez coder votre propre version de la less en très peu de lignes de code C. Prenez le temps de le faire, y compris une courte recherche sur les fichiers et les pipes, et vous en ressortirez avec la compréhension nécessaire pour répondre à votre propre question et plus encore :).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X