Outils pour utilisateurs

Outils du site


pages:norae:si:dev_note-art-stream

notes sur l'usage de Flux

Source de départ 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.

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

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.

Cowsay est un autre programme qui écrit à stdout. Cowsay prend une srting, c'est à dire une 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 decowsay.

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

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.

Source: Wikipedia, Standard_streams

Cat

Le programme 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 concaténation de fichiers.
$ cat
Everything I write before pressing Enter
Everything I write before pressing Enter
Gets logged right after
Gets logged right after

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

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

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 :

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 pseudo terminal. Pour d'autres cas de figure, nou spourrions obtenir /dev/tty0, /dev/tty1, ect.

Redirection de flux

pages/norae/si/dev_note-art-stream.txt · Dernière modification : 2021/08/06 11:05 de xavcc