Vous êtes sur la page 1sur 30

Cours UNIX

Présentation des
Processus
9 o tobre 2009

Romuald G RIESNER
Copyright. Tous droits réservés.
Table des matières

Table des matières i

Table des gures iii

Avant propos iv

1 Présentation des pro essus 1


1.1 Dénition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Création des pro essus . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Con urren e entre pro essus . . . . . . . . . . . . . . . . . . . 3
1.4 Liste de pro essus . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4.1 État des pro essus . . . . . . . . . . . . . . . . . . . . 6
1.4.2 Arbores en e des pro essus . . . . . . . . . . . . . . . 8
1.5 Plan d'exé ution . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.6 Redire tion des entrées sorties standards . . . . . . . . . . . . 11
1.6.1 Redire tion de la sortie standard . . . . . . . . . . . . 13
1.6.2 Redire tion des erreurs . . . . . . . . . . . . . . . . . . 14
1.6.3 Redire tion de l'entrée standard . . . . . . . . . . . . . 15
1.6.4 Combinaison des redire tions . . . . . . . . . . . . . . 16
1.6.5 Conduits . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.6.6 Blo de ommandes . . . . . . . . . . . . . . . . . . . . 19
1.7 Terminaison des pro essus . . . . . . . . . . . . . . . . . . . . 19

Bibliographie 22

i
TABLE DES MATIÈRES R. Griesner

Index 23

ii
Table des gures

1.1 Opération de hargement . . . . . . . . . . . . . . . . . . . . . 2


1.2 segment de données système . . . . . . . . . . . . . . . . . . . 3
1.3 Plusieurs utilisateurs onne tés . . . . . . . . . . . . . . . . . 4
1.4 File d'attente des pro essus prêts . . . . . . . . . . . . . . . . 5
1.5 File d'attente de n d'E/S . . . . . . . . . . . . . . . . . . . . 5
1.6 Un pro essus à sa réation . . . . . . . . . . . . . . . . . . . . 12
1.7 Redire tion du stdout . . . . . . . . . . . . . . . . . . . . . . . 13
1.8 Redire tion du stderr . . . . . . . . . . . . . . . . . . . . . . . 15
1.9 Redire tion du stdin . . . . . . . . . . . . . . . . . . . . . . . 16
1.10 Redire tion simultanée du stdin et du stdout . . . . . . . . . . 17
1.11 Un onduit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

iii
Avant propos

Publi
Cet ouvrage s'adresse aux étudiants, aux te hni iens et aux ingénieurs en
informatique qui her hent une introdu tion pratique à Unix en général et
à Linux en parti ulier. D'autre part, je fais souvent référen e aux program-
meurs, aux utilisateurs et autres atégories mas ulines. C'est la fon tion qui
est mas uline et pas la personne qui exer e la fon tion. Je m'adresse don , à
un publi omposé autant de femmes que d'hommes (et/ou inversement).

Considérations légales
Les informations ontenues dans et ouvrage ne sont pas destinées à être
utilisées pour enfreindre la loi sur les Droits d'Auteur et Droits Voisins de la
So iété de l'Information (DADVSI). Le le teur reste entièrement responsable
de l'usage de es informations et sa responsabilité, ivile et pénale, peut être
engagée.
L'utilisation des informations ontenues dans et ouvrage, par le le teur, ne
peuvent en au un as engager la responsabilité de l'auteur, y ompris en as
de perte d'information, de destru tion de matériel et de pertes nan ières de
toute sorte. Et ela quel que soit le but poursuivi par le le teur.

Règles typographiques
Les ara tères du texte ont été é rits en Computer Modern Roman pour les
versions PostS ript destinées à être imprimées et en Times Roman pour les
versions PDF. Pour fa iliter la le ture et la ompréhension, ertains mots du
texte ont été mis en valeur. Vous trouverez i-dessous les règles utilisées.

iv
R. Griesner

Texte télétype à hasse fixe pour :


 le ontenu des programmes et des shell s ripts ;
 les nom des ommandes, des  hiers et des URLs dans le texte.

Texte courrier gras à chasse fixe pour le texte entré par l'utilisa-
teur dans les exemples. C'est à dire, les noms des ommandes suivies de leurs
arguments.
Texte courrier à chasse fixe pour les résultats des ommandes dans les
exemples.
Texte en roman gras pour les ommandes omposées d'un seul ara tère
et les ara tères isolés du texte, lorsque ela est né essaire.
Texte pen hé ave des espa es supplémentaires pour les formules mathéma-
tiques, omme dans y = ax2 + bx + c.
Le ara tère dollar ($) représente l'invite (le prompt en anglais) de l'interpré-
teur de ommande pour l'utilisateur standard et le ara tère dièse (#) pour
l'administrateur root.
Le urseur est représenté par le ara tère souligné (_) et suit généralement
l'invite, omme dans $ _.
L'appui simultané sur la tou he Ctrl et sur la tou he x est s'é rit ^X.
L'é riture [n℄ renvoie à la nième référen e bibliographie in ne.
Les pages indiquées, dans l'index, se rapportent aux pages des paragraphes
où les diérents termes apparaissent.

Commentaires et questions
Pour améliorer et ouvrage, vous pouvez envoyer vos questions, ommen-
taires, remarques, suggestions et signalements d'erreurs à l'adresse éle tron-
ique suivante :

Romuald.Griesneruniv-mulhouse.fr

Colophon
Cet ouvrage a été réalisé sur un ordinateur portable sous Linux (RedHat 8.0)
à l'aide de vim pour l'é riture, ispell pour la orre tion orthographique,

v
R. Griesner

LATEX pour la omposition et xfig pour les gures. La version PostS ript a
été réée ave dvips et PDF ave ps2pdf.

vi
Chapitre 1
Présentation des pro essus

1.1 Dénition
Un pro essus1 orrespond à un programme qui s'exé ute. Un programme
exé utable est onservé dans un  hier binaire sur un support externe d'in-
formation omme un disque dur. Lorsque un pro essus demande au noyau
d'exé uter un programme, e dernier devient un pro essus. Le pro essus de-
mandeur est appelé le parent2 tandis que le nouveau pro essus réé devient
le des endant3 . Tout pro essus peut demander la réation d'un pro essus,
mais il ne peut avoir qu'un seul parent.

1.2 Création des pro essus


La réation d'un pro essus est dé len hée par l'entrée d'une ommande après
l'invite d'un interpréteur de ommandes, un lique de souris sur une i ne ou
par un pro essus au travers d'un appel système approprié que nous verrons
plus loin.
Pour réer un pro essus, le noyau transfert le ontenu du programme exé-
utable orrespondant du support externe d'information vers la mémoire en-
trale. Cette opération, illustrée par la gure 1.1 page 2, se nomme le harge-
ment et omprend les réations, en mémoire entrale, des segments suivants :
 de donnée à partir de l'image des données ontenues dans le  hier exé-
1 pro ess en anglais.
2 Parent Pro ess en anglais.
3 Child Pro ess en anglais.

1
1.2. CRÉATION DES PROCESSUS R. Griesner

utable ;
 de ode à partir de l'image des instru tions ontenues dans le  hier exé-
utable ;
 de pile utilisée pour les appels de fon tions et de pro édures ;
 de données système4 dans lequel le noyau sto ke les informations né es-
saires à la gestion du pro essus.

segment de données

données
chargement
instructions
segment de code
pgm

Disque Dur
segment de pile

segment de données
système

Mémoire Centrale
Fig. 1.1  Opération de hargement

Remarque : la des ription des segments asso iés au pro essus ne orrespon-
dant pas exa tement à la réalité. D'abord par e que haque Unix possède ses
ara téristiques propres dans e domaine et ensuite par e que nous her hons
à a her la réalité relativement omplexe de e mé anisme. Notre appro he,
permet toutefois de se faire une idée de son fon tionnement. Vous trouverez
les détails sur les segment dans le système Linux dans l'ouvrage[1℄.
Ensuite, le noyau ae te un numéro unique, appelé PID omme  Pro ess
4 appelé aussi Pro ess Control Blo k en anglais.

2
1.3. CONCURRENCE ENTRE PROCESSUS R. Griesner

IDenti ation , au pro essus réé. Ce numéro est ins rit dans le segment de
données système. Dans l'état de vos onnaissan e nous pouvons donner une
représentation possible de e segment ave la gure 1.2 page 3. Le premier
pro essus réé s'appelle init et son PID vaut un. C'est l'an être de tous
les pro essus d'un système. Il est lan é pendant la phase de démarrage du
système.

PID
PID processus parent
pointeur seg. de code

pointeur seg. de données


pointeur seg. de pile
lien

Fig. 1.2  segment de données système

Le segment de données système ontient, également, le PID du pro essus


parent, un pointeur vers ha un des autres segments et un lien vers le segment
de données système suivant. Ce dernier hamps est utilisé pour onstruire une
liste ou une le d'attente de pro essus, omme nous le verrons plus loin.

1.3 Con urren e entre pro essus


Nous avons déjà vu5 qu'un utilisateur, qui a ouvert une session, dialogue
ave un interpréteur de ommandes. Un ordinateur sous Unix peut a ueillir
plusieurs utilisateurs simultanément. Nous avons don , à un instant donné,
autant de pro essus qui exé utent le programme bash que nous avons d'util-
isateurs onne tées. Cha un de es pro essus ont leurs segments hargés en
mémoire entrale omme présenté sur la gure 1.3 page 4. Pour simplier le
dessin, seul les segments de ode et de données sont représentés.
À un instant donné le pro esseur ne peut exé uter qu'une seule instru tion du
programme d'un seul pro essus à la fois. Le noyau est don obligé de partager
5 f. Ÿ ?? page ??.

3
1.3. CONCURRENCE ENTRE PROCESSUS R. Griesner

Processeur Memoire Centrale


Terminaux
Interfaces
Bash Donnees
Bash code

Bash Donnees
Bash code

Bash Donnees
Bash code

Fig. 1.3  Plusieurs utilisateurs onne tés

le pro esseur entre les diérents pro essus qui exé utent le même programme
bash. Pour ela le noyau dispose des stru tures de données suivantes :
 une variable ACTIF qui ontient le PID du pro essus dont le ode est en
ours d'exé ution ;
 une le d'attente des pro essus prêts à être exé utés.
Le noyau attribue à haque pro esse qui s'exé ute une durée d'exé ution
appelée quantum de temps. Après l'é oulement de ette durée le pro essus
a tif est suspendu et son PID est déposé dans la le d'attente des pro essus
prêts. Le PID du premier pro essus est extrait de la le d'attente puis af-
fe té à la variable ACTIF. Ensuite le pro essus orrespondant est relan é. Ce
mé anisme est présenté sur la gure 1.4 page 5.
Le quantum de temps est très ourt, de l'ordre de la millise onde voire plus
petit en ore. Soit environs 1000 pro essus exé utés par se onde. Cela donne
l'impression à l'utilisateur de disposer de l'ordinateur pour lui tout seul et
que les pro essus s'exé utent en parallèle.
Lors de la réation d'un pro essus, son PID est introduit dans la le d'attente
des pro essus prêts et elui i doit attendre son tour pour démarrer. Un
pro essus se termine lorsqu'il est a tif et demande sa terminaison au noyau.
Ce mé anisme n'est pas parfait ar un pro essus qui demande la réalisation
d'une entrée sortie se voit attribuer un quantum de temps qu'il passera à
attendre la n de l' entrée sortie. Don pour libérer le pro esseur pendant
es temps d'attente, le noyau dispose d'une le d'attente supplémentaire : la
le d'attente de n d'entrée sortie.

4
1.3. CONCURRENCE ENTRE PROCESSUS R. Griesner

Creation

Fin
Quantum de temps

File d’attente des


23 processus PRETS
17
13
10 12 ACTIF
Terminaison
Fig. 1.4  File d'attente des pro essus prêts

Dès qu'un pro essus demande une entrée sortie, le noyau le suspend et trans-
fert son PID de la variable ACTIF vers la le d'attente de n d'entrée sortie
et le premier pro essus prêt devient a tif. Lorsqu'un entrée sortie se termine
le PID du pro essus, qui en avait fait la demande, est extrait de la le d'at-
tente de n d'entrée sortie et re y lé dans le d'attente des pro essus prêts.
Ce mé anisme est dé rit sur la gure 1.5 page 5.

Creation

Fin
Quantum de temps

File d’attente des


23 processus PRETS
17 38
13 43 File d’attente
10 12 26 de fin d’E/S
Terminaison
ACTIF

Fig. 1.5  File d'attente de n d'E/S

5
1.4. LISTE DE PROCESSUS R. Griesner

1.4 Liste de pro essus


1.4.1 État des pro essus

Pour a éder à l'état des pro essus nous utilisons la ommande ps omme
 pro ess status . Cette ommande est utilisée par obtenir la liste des pro-
essus qui ont été réés à partir du terminal ourant. Exemple :

$ ps
PID TTY TIME CMD
3182 pts/0 00:00:00 bash
3183 pts/0 00:00:00 ps
$ _

La première olonne indique la PID de haque pro essus, la olonne TTY


donne le nom du terminal et la olonne CMD le nom du programme ou de la
ommande. Dans notre terminal nous avons deux ommandes bash et ps. En
eet, ette dernière ommande se retrouve elle même dans la liste. Voyons
maintenant le résultat d'un nouvel appel de la ommande ps.

$ ps
PID TTY TIME CMD
3182 pts/0 00:00:00 bash
3184 pts/0 00:00:00 ps
$ _

Nous remarquons que le PID de la ommande ps possède un autre PID que


dans l'exemple pré édent. C'est normal ar le noyau rée un nouveau PID à
haque réation de pro essus. Dans nos deux exemples nous utilisons le même
programme, onservé dans un  hier, mais nous obtenons deux pro essus
diérents, 'est à dire un à haque exé ution.
La ommande ps a epte de nombreuse options. Nous donnons, i-dessous
les plus utiles.
L'option -u suivie d'un user_id a he la liste de tous les pro essus de et
utilisateur. Exemple :

$ ps -ugriesner
PID TTY TIME CMD

6
1.4. LISTE DE PROCESSUS R. Griesner

910 ? 00:00:00 gnome-session


955 ? 00:00:00 ssh-agent
1005 ? 00:00:00 kdeinit
.......
1011 pts/0 00:00:00 bash
1067 ? 00:00:00 konsole
1069 pts/1 00:00:00 bash
1136 ? 00:00:00 kdeinit
1162 pts/1 00:00:00 vim
1206 pts/0 00:00:00 ps
$ _

La liste a été volontairement tronquée. Nous voyons que l'utilisateur griesner


a ouvert une session gnome, qu'il a ouvert deux émulateur de terminal (pts/0
et pts/1), que dans l'un deux une édition de texte à l'aide de vim est en ours
et que dans l'autre il a simplement démarré la ommande ps. Les éléments
de la olonne TTY marqués d'un point d'interrogation orrespondent aux
pro essus démarrés en dehors d'un terminal.
Remarque : nous observons que nous avons deux le pro essus bash qui s'exé-
ute. En eet, il peut exister, simultanément, plusieurs pro essus qui exé u-
tent le même programme. I i bash est le nom du  hier qui ontient l'exé-
utable du programme bash.
L'option -t, suivie du nom d'un terminal, a he la liste des pro essus dé-
marré à partir de e terminal. Exemple :

$ ps -tpts/1
1162 pts/1 00:00:00 vim
1205 pts/1 00:00:00 bash
$ _

Nous retrouvons une partie de la liste pré édente réduite au terminal /pts/1.
L'option -f a he la liste des pro essus démarrés à partir du terminal
ourant ave des informations omplémentaires. Nous y trouvons le user_id
propriétaire du pro essus, le PID du pro essus parent et l'heure de lan ement
dans la olonne STIME6 . Exemple :

$ ps -f
UID PID PPID C STIME TTY TIME CMD
griesner 1069 1067 0 08:59 pts/0 00:00:00 /bin/bash
6 omme Start Time.

7
1.4. LISTE DE PROCESSUS R. Griesner

griesner 1249 1069 0 09:26 pts/0 00:00:00 ps -f


$ _

Et enn l'option -e pour obtenir la liste de tous les pro essus qui tourne
a tuellement sur l'ordinateur. Exemple :

$ ps -e
PID TTY TIME CMD
1 ? 00:00:04 init
2 ? 00:00:00 keventd
3 ? 00:00:00 kapmd
4 ? 00:00:00 ksoftirqd_CPU0
.............
$ ps -e | wc -l
64
$ _

La liste débute ave le pro essus init de PID numéro un et suivent tous les
autres pro essus. A tuellement, nous avons 64 pro essus qui s'exé utent sur
l'ordinateur.

1.4.2 Arbores en e des pro essus

L'arbores en e des pro essus,à partir du pro essus init, est obtenu à l'aide
de la ommande pstree, omme  Pro ess Tree . Exemple :

$ pstree
init-+-anacron
|-apmd
|-atd
|-gdm-binary---gdm-binary-+-X
| ‘-gnome-session---ssh-agent
|-gnome-panel
|-konsole---bash---pstree
|-konsole---bash
|-kswapd
‘-xscreensaver
$ _

Nous voyons dans la septième ligne apparaitre la ommande pstree et dans


la huitième l'interpréteur de ommande bash qui s'exé ute dans le terminal
pts/1.

8
1.5. PLAN D'EXÉCUTION R. Griesner

1.5 Plan d'exé ution


Lorsqu'un utilisateur démarre une ommande ou un programme à partir d'un
interpréteur de ommandes dans un terminal, le programme asso ié s'exé ute
en avant plan7 . Cela signie que ette ommande ou programme le lavier et
l'utilisateur doit attendre la n du pro essus asso ié pour lan er la ommande
ou le programme suivant.
Il existe une autre manière de démarrer une ommande pour que elle- i ne
bloque pas le lavier e qui permet, à l'utilisateur, de démarrer la ommande
suivante sans attendre la terminaison de la première. Dans e as le pro essus
asso ié s'exé ute en arrière plan8. L'avantage de ette méthode est de pou-
voirs exé uter plusieurs pro essus simultanément. L'in onvénient est que tous
les pro essus en arrière plan ne peuvent plus a éder au lavier, puisqu'il l'on
libéré, et ne peuvent don plus faire de le ture sur elui- i. Sont on ernés
par le lan ement en arrière plan les pro essus qui ne font de le ture du lavier
omme un ompilateur. Pour démarrer une ommande ou un programme en
arrière plan il sut d'ajouter la ara tère é ommer ial (&) à la n de la
ligne de ommande. Le PID du dernier pro essus démarré en arrière plan se
trouve dans la variable d'environnement point d'ex lamation.
Exemple :

$ sleep 100&
[1] 16836
$ echo $!
16836
$ ps
PID TTY TIME CMD
1011 pts/0 00:00:00 bash
16836 pts/0 00:00:00 sleep
16839 pts/0 00:00:00 ps
$ jobs
[1]+ 16836
$ _

La ommande sleep, qui orrespond à un pro essus qui dort pendant le


nombre de se ondes passé en argument, est démarrée en arrière plan, e qui
permet de reprendre la main tout de suite sans attendre la terminaison de la
ommande. Avant le retour de l'invite, il s'a he un nombre entre ro het,
7 foreground en anglais.
8 ba kground en anglais.

9
1.5. PLAN D'EXÉCUTION R. Griesner

que nous verrons plus loin et le PID du pro essus démarré en arrière plan.
La ommande jobs a he le PID des pro essus démarrés en arrière plan et
à ha un d'eux il ae te, entre ro het, un numéro de tâ he9 . La présen e du
signe plus (+) sera vue plus loin.
Prenons maintenant l'exemple d'un pro essus qui réalise une le ture lavier :

/* programme pgm */
main()
{
int n; /* un nombre entier */
printf("Entrer un entier : \n");
s anf("%d", &n);
printf("n=%d\n", n);
exit(0);
}

Démarrons e programme, d'abord, en avant plus, puis en arrière plan :

$ ./pgm # démarrage en avant plan


Entrer un entier :
15
n=15
$ ./pgm& # démarrage en arrière plan
[1] 2455
$ Entrer un entier :

[1]+ Stopped ./pgm


$ jobs # liste de tâche en arrière plan
[1]+ Stopped 2455
$ fg %1 # rappel en avant plan
./pgm
15
n=15
$ _

Le lan ement en avant plan permet de vérier le dialogue de l'utilisateur ave


le pro essus. Après le démarrage en arrière plan l'invite revient et le message
du pro essus s'a he, bien qu'il soit en arrière plan. Nous appuyons sur le
tou he ENTRÉE et j'obtiens un message omme quoi la tâ he numéro un est
arrêtée10 puis l'invite revient. Ave la ommande fg, omme  foreground ,
9 job en anglais.
10 stopped en anglais.

10
1.6. REDIRECTION DES ENTRÉES SORTIES STANDARDS R. Griesner

nous ramenons le pro essus qui était en arrière plan en ave plan e qui
nous permet, enn d'entrer un entier pour que le pro essus puisse ontinuer
à s'exé uter.
Voyons, maintenant, e qui se passe lorsque nous démarrons plusieurs pro-
essus, qui réalisent une le ture du lavier, en arrière plan.

$ cp pgm pgm_2 # duplication de pgm


$ cp pgm pgm_3 # duplication de pgm
$ ./pgm& ./pgm_2& ./pgm_3& # démarrage
$ Entrer un entier :
Entrer un entier :
Entrer un entier :

[1] Stopped ./pgm


[2]- Stopped ./pgm_2
[3]+ Stopped ./pgm_3
$ jobs
[1] Stopped ./pgm
[2]- Stopped ./pgm_2
[3]+ Stopped ./pgm_3
$ _

Nous avons, d'abord, réalisée deux opies du programme pgm. Ensuite, nous
avons démarré en arrière plan les trois programmes, qui ha un ont a hé
leur message et se sont retrouvés arrêtés. Nous retrouvons le numéros de tâ he
entre ro het. Le signe plus (+) indique la tâ he la plus ré emment démarrée
et signe moins (-) la suivante dans l'ordre. Nous pouvons, maintenant, hoisir
quelle tâ he nous voulons ramener en avons plan en donnant à la ommande
fg le numéro de tâ he en argument après un ara tère pour ent (%).
Remarque : dans la ligne de ommande du démarrage des trois pro essus il
ne faut pas séparer les nom des programmes par un point virgule sinon vous
obtenez un message d'erreur.

1.6 Redire tion des entrées sorties standards


Pour réaliser ette opération, nous utilisons les méta ara tères <, >, & et |.
A sa réation par le noyau, haque pro essus est doté de trois  hiers stan-
dards d'entrée sortie appelés :
 stdin, de numéro d'identi ation zéro, le  hier standard d'entrée pour
les le tures ;

11
1.6. REDIRECTION DES ENTRÉES SORTIES STANDARDS R. Griesner

 stdout, de numéro d'identi ation un, le  hier standard de sortie pour


les é ritures ;
 stderr, de numéro d'identi ation deux, le  hier standard des erreurs
pour l'é riture des messages d'erreur.

Par défaut les  hiers standards d'entrée sortie sont dirigés (ae tés, onne -
tés) vers des éléments matériels du poste de travail :
 stdin est onne té au lavier ;
 stdout est onne té à l'é ran ;
 stderr est également onne té à l'é ran.

Sur la gure 1.6 page 12 nous avons un pro essus qui lit ses données à partir
du lavier et é rit ses résultats et ses messages d'erreur sur l'é ran.
Le temps de l'exé ution d'une ommande l'ae tation standard des entrées
sorties peut-être modiée. C'est e que l'on appelle la redire tion des entrées
sorties.

STDIN PROCESS STDOUT

ST
DE
RR

Fig. 1.6  Un pro essus à sa réation

12
1.6. REDIRECTION DES ENTRÉES SORTIES STANDARDS R. Griesner

STDIN PROCESS STDOUT

Fig. 1.7  Redire tion du stdout

1.6.1 Redire tion de la sortie standard

Dans e as, les é ritures ne se font plus sur l'é ran mais dans un  hier qui
onservera le résultat de la ommande. La gure 1.7 page 13 nous montre e
type de redire tion.
Exemple :

$ date 1 > fic_date # redirection dans fic_date


$ cat fic_date # affichage du contenu de fic_date
jeu oct 03 15:55:23 CET 1991
$ _

Remarque : le texte qui suit le ara tère # est un ommentaire, ignoré par
l'interpréteur de ommandes.
La ommande date é rit son résultat dans le  hier {fi _date. Il ne s'a he
don rien à l'é ran. La ommande at a he, à l'é ran, le ontenu du  hier
fi _date.
Le ontenu du  hier fi _date est d'abord ea é avant de re evoir le résultat
de la ommande date. Pour onserver l'an ien ontenu du  hier il faut
pro éder de la manière suivante :

13
1.6. REDIRECTION DES ENTRÉES SORTIES STANDARDS R. Griesner

$ pwd 1 > fic_res # création de fic_res


$ date 1 >> fic_res # ajout à fic_res
$ cat fic_res # affichage de fic_res
/home/griesner/latex/unix_doc
jeu oct 03 15:55:23 CET 1991
$ _

Lors de l'exé ution de la ommande pwd le ontenu du  hier fi _res est


d'abord ea é, puis il reçoit le résultat de la ommande. Ensuite l'exé ution
de la ommande date on atène son résultat au ontenu pré édent du  hier
fi _res. Vous aurez remarqué le doublement du ara tère > pour éviter
l'ea ement préalable du  hier.
Une forme parti ulière de redire tion de la sortie standard onsiste à la
rediriger vers le  hier /dev/null. Ce  hier est la orbeille générale de
tout système Unix. Exemple :

$ ls fic > /dev/null


$ _

L'a hage de la ommande ls est don perdu. Nous verrons plus loin à quoi
ela peut servir.

1.6.2 Redire tion des erreurs

Comme pour la redire tion de stdout, les erreurs peuvent être redirigées vers
un  hier. La gure 1.8 page 15 nous montre e type de redire tion.
Exemple :

$ ls fic 2 > fic_err # redirection dans fic__err


$ cat fic_err # affichage du contenu de fic_date
ls: fic: Aucun fichier ou répertoire de ce type
$ _

Si le  hier fi n'existe pas, la ommande ls a he un message d'erreur sur


stderr qui est redirigé vers le  hier fi _err. Il ne s'a he rien à l'é ran.
Nous vérions que e  hier ontient bien un message d'erreur ave la om-
mande at.
Si le  hier fi existe, la ommande ls a he le nom fi sur son stdout
qui est onne té à l'é ran (situation par défaut) et le  hier fi _err est vide
ar il n'y a pas de message d'erreur de la part de la ommande ls.

14
1.6. REDIRECTION DES ENTRÉES SORTIES STANDARDS R. Griesner

STDIN PROCESS

ST
DE
RR

Fig. 1.8  Redire tion du stderr

1.6.3 Redire tion de l'entrée standard

Dans e as le pro essus lit ses données à partir d'un  hier. La gure 1.9
page 16 nous montre e type de redire tion.
Exemple :

$ pgm 0 < pgm_in


...
... résultats de pgm ..
...
$ _

La ommande pgm lit ses données à partir du  hier pgm_in. L'utilisateur n'a
pas besoin d'entrer es données au lavier. Il aura simplement, au préalable,
réé le  hier pgm_in (ave vim). Ce  hier ontient une donnée par ligne et
es données doivent être du type attendu par le programme. Il est intéres-
sant de réer un  hier de données, pendant la phase de mise au point d'un
programme, surtout si les données sont nombreuses. Cela évite d'avoir à les
retaper à haque exé ution du programme.

15
1.6. REDIRECTION DES ENTRÉES SORTIES STANDARDS R. Griesner

STDIN PROCESS STDOUT

Fig. 1.9  Redire tion du stdin

Dans les redire tions pré édentes, il est possible d'omettre les numéros d'iden-
ti ation de stdin et stdout. Grâ e à ette fa ilité d'é riture nous pouvons
é rire :

$ date > fic_res


$ _
$ pgm < pgm_in
$ _

1.6.4 Combinaison des redire tions

Notre programme pgm peut lire ses données à partir du  hier pgm_in et
é rire ses résultats dans le  hier pgm_out simultanément omme indiqué sur
la gure 1.10 page 17.
Nos pouvons aussi rediriger, simultanément, le stdout et stderr vers le
même  hier. Exemple :

$ ls fic 1 > ls_res 2 > &1


$ cat ls_res

16
1.6. REDIRECTION DES ENTRÉES SORTIES STANDARDS R. Griesner

STDIN PROCESS STDOUT

Fig. 1.10  Redire tion simultanée du stdin et du stdout

fic
$ _

ou

$ cat ls_res
ls: fic: Aucun fichier ou répertoire de ce type
$ _

suivant que le  hier  existe ou pas.


Attention l'ordre des redire tions est important. Le ara tère & indique que 1
n'est pas un nom de  hier mais le numéro d'identi ation de stdout. Dans
notre exemple, la ommande ls n'a he rien à l'é ran.
Enn un dernier exemple dans lequel nous ombinons toutes les redire tions :

$ pgm < pgm_in > pgm_out 2>pgm_err


$ _

Il ne s'a he rien à l'é ran et pgm n'attend pas de données à partir du


lavier. Cette manière de pro éder à l'avantage de onserver le jeu de données
utilisées, les résultats et les erreurs dans des  hiers.

17
1.6. REDIRECTION DES ENTRÉES SORTIES STANDARDS R. Griesner

1.6.5 Conduits

Imaginons que nous voulons ompter le nombre de  hiers dans notre réper-
toire ourant (Working Dire tory). Une première méthode est exposée i-
dessous :

$ ls > yuyu # liste des fichiers dans yuyu


$ wc -l yuyu # comptage du nombre de ligne de yuyu
34
$ rm yuyu # effacement de yuyu devenu inutile
$ _

La ommande w -l donne 34 omme résultat. En fait il n'y a que 33  hiers


ar le  hier yuyu est ompris dans le résultat. Une meilleur solution onsiste
à rediriger dire tement le stdout de la ommande ls vers le stdin de la
ommande w -l. Cela s'appelle un onduit ou un pipe en anglais. Pour
réaliser e onduit, nous é rivons :

$ ls | wc -l
33
$ _

Cette méthode est plus on ise et a l'avantage de donner le résultat exa t.


La gure 1.11 page 18 illustre ette manière de pro éder.
Conduit

STDIN STDOUT
STDIN
ls STDOUT
wc −l

Fig. 1.11  Un onduit

18
1.7. TERMINAISON DES PROCESSUS R. Griesner

1.6.6 Blo de ommandes

Un bloque de ommandes est onstitué d'une liste de ommandes en adrée


par des a olades. Un bloque de ommande permet de rediriger les entrées
sorties standard pour l'ensemble des ommandes de la liste. Exemple :

$ {
> pgm > progs_out
> prog >> progs_out
> }<progs_in
$ _

Les programmes pgm et prog lisent sur leur stdin qui sont redirigés vers le
 hier progs_in. Le ara tère supérieur est l'invite se ondaire ( ontenue dans
la variable PS2) qui indique que la ligne de ommande n'est pas terminée.
Autre exemple :

$ { pwd; date; } > res


$ cat res
/home/griesner/latex/unixdoc
jeu oct 03 15:55:23 CET 1991
$ _

1.7 Terminaison des pro essus


Un pro essus se termine, généralement, de lui même à l'aide de l'appel sys-
tème exit() qui transmet un état de sortie11 odé sur un o tet au pro es-
sus parent. Si un programme ne se termine pas expli itement par et appel
système alors il se termine (tout de même) ave un valeur d'état de sortie
indéterminé. Prenons omme exemple le programme pgm_1 qui se termine
sans et appel système, exé utons le et vérions son état de sortie.

/* programme pgm_1 */
main()
{
printf("hello\n");
}
11 Exit Status en anglais.

19
1.7. TERMINAISON DES PROCESSUS R. Griesner

$ ./pgm_1
hello
$ echo $? # affichage état de sortie
6
$ _

Maintenant orrigeons e programme en ajoutant l'appel système exit :

/* programme pgm_2 */
main()
{
printf("hello\n");
exit(0);
/*
* les instru tions qui suivent ne
* jamais exé utées.
*/
printf("boy\n");
}

et exé utons le :

$ ./pgm_2
hello
$ echo $? # affichage état de sortie
0
$ _

Dans le as d'un shell s ript, le terminaison se fait à l'aide de la ommande


exit suivie de la valeur de l'état de sortie en argument.
Un pro essus peut, aussi se terminer sur ommande. En eet, la ommande
kill permet de terminer le pro essus dont le PID est passé en argument.
Exemple :

$ sleep 1000&
[1] 16836
$ ps
PID TTY TIME CMD
1011 pts/0 00:00:00 bash

20
1.7. TERMINAISON DES PROCESSUS R. Griesner

16836 pts/0 00:00:00 sleep


16839 pts/0 00:00:00 ps
$ kill 16836
$ ps
PID TTY TIME CMD
1011 pts/0 00:00:00 bash
16864 pts/0 00:00:00 ps
[1]+ Complété sleep 1000
$ _

La ommande sleep est démarrée en arrière plan, e qui permet de reprendre


la main tout de suite sans attendre la terminaison de la ommande. La om-
mande ps permet de ré upérer le PID du pro essus sleep et la ommande
kill de terminer e dernier. Lorsque nous entrons, à nouveau, la ommande
ps nous observons bien que le pro essus sleep à bien disparu. La dernière
ligne de l'a hage nous informe qu'un pro essus en arrière plan s'est terminé.
Une autre manière de pro éder onsiste à utiliser la ommande jobs à la
pla e de la ommande ps. Dans e as, il ne s'a he que les pro essus qui
s'exé utent en arrière plan. À ha un d'eux est ae té un numéro de tâ he
et elui- i peut être utilisé pour terminer le pro essus. Pour ela nous util-
isons, aussi, la ommande kill mais ave le ara tère pour ent (%) suivi du
numéro de tâ he en argument. Exemple :

$ sleep 1000&
[1] 16836
jobs
[1]+ Running sleep 1000 &
$ kill %1
$ ps
PID TTY TIME CMD
1011 pts/0 00:00:00 bash
16864 pts/0 00:00:00 ps
[1]+ Complété sleep 1000
$ _

21
Bibliographie

[1℄ XXXXXXX Newham and Bill Rosenblatt


Le noyau Linux.
O'Reilly XXXXX XXXXX, 1993.

22
Index
arrière plan, 9 de données, 1
avant plan, 9 de données système, 1
de pile, 1
ba kground, 9 stderr, 11
hild pro ess, 1 stdin, 11
ommande stdout, 11
exit, 19
fg, 10
init, 2
jobs, 9, 21
kill, 20
ps, 6
pstree, 8
sleep, 9
Exit Status, 19
les d'attente, 3
foreground, 9
parent pro ess, 1
PID, 2
pro ess, 1
Pro ess Control Blo k, 1
Pro ess Status, 6
pro essus, 1
pro essus des endant, 1
pro essus parent, 1
quantum de temps, 3
segment
de ode, 1

23

Vous aimerez peut-être aussi