Précédent Index Suivant

2.3   Maniement en tout genre

Une tâche est créée comme un appel à une fonction (le nom du programme sur lequel est créée la tâche) éventuellement suivie de ses arguments d'appel (les option d'exécution, le nom des fichiers concernés, etc ...). Par exemple :
 ls  -Ral  ia11 
est une commande de trois mots invoquant, c'est-à-dire demandant la mise en place d'un schéma où sera exécuté le programme ls (pour « lister ») avec deux arguments : Lorsque une tâche est créée, elle hérite des flux connectés à sa mère (ie. la tâche qui l'a engendrée). Ainsi pour l'exemple précédent aura-t'on :


Parce qu'elles se partagent en lecture le clavier, la tâche mère est usuellement mise en sommeil le temps que la tâche fille s'achève. Lorsque la tâche de listage sera terminée, l'interprète de commandes sollicitera une nouvelle commande à partir du clavier.

La fameuse cascade (pipe) d'UNIX permet de connecter des tâches via un flux. Ainsi
 ls  -Ral  ia11  |  fgrep  doc 
conduit-il au schéma suivant où ls et fgrep sont mis en cascade.


La tâche de listage crée un flux de caractères exploité par la tâche de filtrage (fgrep doc ne transmet en sortie que les lignes contenant la séquence contigue: de lettres d, o et c). Comme précédemment, l'interprète de commandes (sh) attend la fin de ses deux tâches filles avant de requérir une nouvelle commande ; par contre le filtrage ne vivra que tant que le listage continuera de l'alimenter en lignes à scruter.

La cascade ne permet que de créer des chaines linéaires de tâches et est spécifiée syntaxiquement, pour /bin/sh, par une barre verticale | séparant les tâches connectées. Un autre mécanisme dit de détournement (ou redirection) des flux permet que les tâches engendrées ne soient plus liées, en entrée comme en sortie, au fichier spécial /dev/tty. Ainsi la commande :
 fgrep  doc  <exercice1 
crée-t'elle :


Il y a eu détournement du flux d'entrée de la tâche de filtrage grâce à la spécification <exercice1 apparaissant dans la commande. Les sorties, comme tout autre flux, peuvent aussi être détournées comme le montre :
 fgrep  doc  >tmp  <exercice1 
qui engendrera :


Les sorties engendrées par fgrep doc formeront le fichier de nom tmp (l'acronyme tmp est, dans le monde UNIX, l'abréviation usuelle pour temporaire.)

Qu'ils soient entrants ou sortants, une tâche peut disposer d'au plus une vingtaine de flux numérotés à partir de zéro. Les trois premiers sont usuellement nommés : Les sorties normales sont usuellement faites sur stdout, les comptes-rendus d'erreur sur stderr. Symétriquement les lectures sont effectuées sur stdin. Tous les flux peuvent être redirigés par une spécification. Dans ce qui suit les crochets carrés [ et ] signalent une éventualité; les alinéas { et } une alternative. Ainsi numéro de flux est optionnel tandis que le symbole désignant le sens du flux est obligatoirement > ou <.
numéro de flux > fichier 
numéro de flux < fichier  
Ainsi
 fgrep doc <exercice1 >tmp 
est-il analogue à (l'ordre des spécifications de détournement est inimportant)
 fgrep doc 1>tmp 0<exercice1 2>/dev/tty  
ce qui permet d'obtenir les messages d'erreurs sur l'écran et le résultat du travail normal de filtrage dans le fichier tmp.

L'opérateur | permet donc de connecter le flux stdout (1) d'une tâche au flux stdin (0) de la tâche suivante.

Dans tous les exemples précédents, la tâche mère était mise en attente de la fin des tâches filles. Le spécificateur & permet de supprimer cette contrainte et donc d'avoir plusieurs tâches simultanément actives. Ainsi
fgrep doc <exercice1 & ls -Ral ia11 >tmp 
crée-t'il


où les tâches de filtrage et de listage se dérouleront simultanément. L'écran étant partagé par ces deux seules tâches actives, les sorties du filtrage et les comptes-rendus d'erreur du listage seront affichés mélangés. Lorsque cette dernière sera achevée et indépendamment du filtrage qui pourra se poursuivre, l'interprète de commande se réveillera et sollicitera une nouvelle commande.

Le partage de /dev/tty peut conduire, si mal géré, à des situations dangereuses. Lorsque plusieurs tâches débitent sur l'écran, il peut être difficile de reconnaitre la paternité des diverses sorties. Un écran intéressant peut disparaitre, « poussé » par un texte routinier ! Mais lorsque plusieurs tâches se concurrencent pour lire le clavier, la situation peut devenir bien pire car on ne peut assurer vers quelle tâche ira tout caractère frappé ! C'est pourquoi, dans les exemples ci-dessus, à tout instant, il n'y avait qu'une seule tâche au plus pouvant requérir une entrée au clavier : sh en sommeil ne peut lire, ls et fgrep ne requièrent rien en entrée. L'exemple suivant exhibe une compétition entre deux tâches.
 more tmp & 
qui engendre :


Diverses manières existent de s'en sortir suivant la nature des tâches en compétition, par exemple l'appui répété sur la touche 'DEL' ou 'ANNULATION' (cf. signalisation). Les cas les plus graves nécessitent de tuer toutes les tâches d'un utilisateur depuis une autre console !

Divers programmes permettent de mieux manipuler flux, fichiers et commandes. On peut notamment convertir entre eux ces mêmes flux, fichiers ou commandes. Le tableau suivant recense ces utilitaires et les principales variantes :

pour convertir un ¯ en un ®      
flux   > tee sh `
fichier < cat cp mv sh
commande   echo eval
  flux fichier commande

Ainsi la duplication d'un fichier peut-elle s'effectuer de multiples manières.