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 :
-
les options
l,
a et
R (le style
UNIX
veut que les option soient le plus souvent précédées d'un tiret)
-
un nom :
ia11
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 :
-
stdin (pour standard input) et porte le numéro zéro,
-
stdout (pour standard output) et porte le numéro un,
-
stderr (pour standard error output) et porte le numéro deux.
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.
-
tee <source >destination
commande sans argument qui use de deux flux.
-
cat source >destination
commande dont on détourne la sortie.
-
cp sortie destination
la commande spécialisée pour ce faire.