====== notes sur l'usage de Flux ====== Source de départ [[https://lucasfcosta.com/2019/04/07/streams-introduction.html|Lucas Fernandes da Costa]], Avril 2019, Copyleft Moins de logiciels signifie que vous passez moins de temps à le mettre à jour, moins de temps à le réparer et moins de temps à y penser. La seule chose meilleure que "moins de logiciels", c'est qu'il n'y a pas de logiciel du tout. Les flux nous aident à écrire moins de logiciels parce qu'ils permettent aux programmes de communiquer entre eux. Si les programmes ne peuvent pas communiquer, ils doivent avoir trop de fonctionnalités pour satisfaire les besoins de leurs utilisateurs, créant ainsi plus de logiciels. En permettant la communication entre les processus, les flux encouragent les logiciels à être plus petits et peuvent même parfois empêcher leur écriture. Apprendre à connaître les flux vous aide à mieux comprendre le fonctionnement des systèmes UNIX et à simplifier votre environnement de développement. ===== Que sont les flux ===== De la même façon qu'une rivière a un cours d'eau, les programmes ont des cours d'eau de données. De plus, tout comme vous pouvez utiliser des tuyaux d'acier pour transporter l'eau d'un endroit à un autre, vous pouvez utiliser des tuyaux UNIX pour transporter des données d'un programme à un autre. C'est cette analogie qui a inspiré la conception des flux : > « //Nous devrions avoir quelques moyens de connecter des programmes comme un tuyau d'arrosage - visser un autre segment quand il devient nécessaire de masser les données d'une autre manière. C'est aussi la voie des Input/Output.// » - Douglas McIlroy Les flux peuvent être utilisés pour transférer des données dans des programmes et pour en extraire des données. {{ program-input-output-streams.png }} Sous UNIX, les programmes reçoivent certains flux qui leur sont attachés par défaut, à la fois en entrée et en sortie. Nous appelons ces flux standard. Il existe trois flux standard différents : * ''stdin'', pour //standard input// ou entrée standard est le flux qui alimente votre programme en données * ''stdout'', pour //standard output// ou sortie standard est le flux sur lequel votre programme écrit sa sortie principale * ''stderr'', pour //standard error// ou erreur standard est le flux dans lequel votre programme écrit ses messages d'erreur ==== Fortune et Cowsay ==== [[wp>Fortune_(Unix)|Fortune]] est un programme, par exemple, écrit quelques //morceaux de sagesse// dans le flux ''stdout''. ~$ fortune -a Don't relax! It's only your tension that's holding you together Quand ''fortune'' a fonctionné, il s'est attaché à ''stdin'', ''stdout'' et ''stderr''. Puisqu'il n'a pas produit d'erreurs et n'a pas reçu d'entrée externe, il a juste écrit la sortie dans ''stdout''. {{ fortune-streams.png }} [[wp>Cowsay|Cowsay]] est un autre programme qui écrit à ''stdout''. Cowsay prend une //srting//, c'est à dire une [[wp>fr:Chaîne_de_caractères|Chaîne de caractères]] puis affiche une vache exprimant cette chaîne. `--> cowsay "Happy Birthday" ________________ < Happy Birthday > ---------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || Contrairement à''Fortune'', ce n'est pas forcément ''cosay'' qui dit des choses //intelligentes// - comme nous venons de le voir - Puisque que c'est lautrice ou l'auteur de la cahine de caractère qui écrit ces choses. Heureusement, nous pouvons nourrir le flux ''stdin'' qui y est rattaché. Tout ce que nous avons à faire pour rendre ''cowsay'' //plus intelligent// et répéter les citations ''fortune'' est d'utiliser ce que nous appelons un tuyau, //pipe// - représenté par ''|'' - pour attacher le ''stdout'' de ''fortune'' au ''stdin'' de''cowsay''. `--> fortune -a | cowsay ________________________________________ / A banker is a fellow who lends you his \ | umbrella when the sun is shining and | | wants it back the minute it begins to | | rain. | | | \ -- Mark Twain / ---------------------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || Nous utilisons un //pipe// pour connecter le flux de sortie d'un programme au flux d'entrée d'un autre programme. {{ fortune-and-cowsay-streams.png }} Nous voyons ici la sortie de ''cowsay'' sur //l'écran// car, par défaut, le terminal reçoit les flux standard ''stdin'', ''stdout'' et ''stderr'' qui sont attachés à ''cowsay''. Les données entrent par ''stdout'' et ''stderr'' de 'fortune puis sortent par l'autre extrémité : le moniteur. De la même façon, l'entrée de votre clavier passe par ''stdin'' vers un programme. {{ standard-streams-devices.png }} Source: Wikipedia, [[wp>Standard_streams]] ==== Cat ==== Le programme [[wp>Cat_(Unix)|cat]], par exemple, utilise le ''stdin'' pour recevoir les entrées de votre clavier et le ''stdout'' pour les envoyer. ''cat'' est un utilitaire Unix standard qui lit les fichiers séquentiellement, en les écrivant en sortie standard. Le nom est dérivé de sa fonction de con**cat**énation de fichiers. $ cat Everything I write before pressing Enter Everything I write before pressing Enter Gets logged right after Gets logged right after {{ cat-keyboard-and-display.png }} En programmation, la concaténation de deux chaînes de caractères consiste à les mettre bout à bout. Le terme peut désigner: * l'opération de concaténer ces chaînes, * le résultat de cette opération. **Exemple** : La concaténation des chaînes ''"Hello"'' et ''" world !"'' donne ''"Hello world !"''. Nous pouvons rendre cette opération plus élaborée en utilisant ''[[wp>Sed|sed]]'' pour remplacer toutes les occurrences de ''I'' par ''We'' chaque fois que nous appuyons sur ''Entrée'' : $ cat | sed -E "s/I/We/" I am a cow doing streams We am a cow doing streams sed (éditeur de flux) est un utilitaire Unix qui analyse et transforme le texte en utilisant un langage de programmation simple et compact, basé sur les fonctionnalités de script de l'éditeur interactive ed ("editor", 1971) et le précédent qed ("quick editor", 1965-66). sed était un des premiers outils pour le traitement des expressions régulières et reste en usage, notamment la substitution de la commande. {{ sed-cat-and-keyboard-and-monitor.png }} ===== Comment les flux communiquent avec le "terminal" ? ===== Les émulateurs de terminaux sont des simulations logicielles de terminaux "réels". Ces émulateurs vous fournissent une interface pour interagir avec le pilote ''TTY'' de Linux. Le //driver// de ''TTY'' est responsable de la manipulation des données en provenance et à destination des programmes. Un téléimprimeur (téléimprimeur, [[wp>fr:Téléscripteur|téléimprimeur]], téléimprimeur ou TTY) est un appareil électromécanique qui peut être utilisé pour envoyer et recevoir des messages dactylographiés par divers moyens de communication, dans des configurations point à point et point à multipoint Un diagramme montrant que les données passent du clavier à l'émulateur de terminal et au pilote ''TTY'' jusqu'à un programme et peuvent ensuite revenir du programme à l'écran. {{ terminal-interaction-diagram.png }} ''tty'' est une commande dans les systèmes d'exploitation Unix et Unix-like pour imprimer le nom du fichier du terminal connecté à l'entrée standard. ''tty'' signifie TeleTYpewriter ChaqueTTY a ses propres flux ''stdin'', ''stdout'' et ''stderr'' qui lui sont connectés. Ce sont les flux fournis aux programmes pour qu'ils lisent (''stdin'') et écrivent (''stdout'' et ''stderr''). Voici une version plus précise de ce qui s'est passé lorsque nous avons lancé ''cat | sed -E "s/I/We/"'' dans le précedent exemple : {{ tty-and-processes.png }} Comme tout sous UNIX, le ''tty'' est un fichier. Chaque instance d'un émulateur de terminal a un fichier ''tty'' différent qui lui est associé. Parce que chaque émulateur lit et écrit dans un fichier différent, ainsi vous ne voyez pas le résultat des programmes que vous exécutez dans toutes les fenêtres que vous avez ouvertes, seulement dans la fenêtre dans laquelle le programme est lancé. Pour savoir quel ''TTY'' est associé à une fenêtre de terminal, vous pouvez utiliser la commande ''tty''. `--> tty /dev/pts/0 Pour une nouvelle fenêtre de terminal `--> tty /dev/pts/1 Dans notre exemple, nous sommes en ''/pts'' se cqui signifie l'usage d'un [[https://linux.die.net/man/4/pts|pseudo terminal]]. Pour d'autres cas de figure, nou spourrions obtenir ''/dev/tty0'', ''/dev/tty1'', ect. ===== Redirection de flux =====