II 02
II 02
II 02
Cours 2
kn@lri.fr
http://www.lri.fr/~kn
Plan
1 Présentation du cours ✓
2 Le système Unix ✓
3 Le système Unix (2)
3.1 Gestion des processus
3.2 Script shells
Dé�nitions
3 / 42
Exécuter un programme ?
Pour exécuter un programme on peut
4 / 42
Microprocesseur
5 / 42
Modèle de Von Neumann
Proposé par John Von Neumann en 1945
Un processeur
De la mémoire
Des périphériques d'entrée/sortie
6 / 42
Jeu d'instructions
Un processeur est un circuit programmable. Il sait exécuter un certain nombre
d'opérations (arithmétiques, logiques, lecture/écriture en mémoire, …).
L'ensemble de ces instructions s'appelle le jeu d'instruction
Chaque instruction possède une représentation en binaire (suite de 0 et de 1)
Par exemple, sur les processeur Intel, 01101001 représente la multiplication
7 / 42
Mémoire et registre
8 / 42
Fonctionnement de l'architecture de Von Neumann
9 / 42
Et donc quand on exécute un programme ?
Un �chier exécutable est un �chier contenant des instructions machines (comme
01101001).
Lorsqu'on l'exécute :
10 / 42
Plusieurs processus ?
Le modèle de Von Neumann seul ne permet pas d'exécuter « plusieurs programmes à la
fois »
Les processeurs modernes possèdent aussi des alarmes con�gurables
Le système d'exploitation con�gure une alarme pour interrompre le processeur toutes
les X㎲
Lors de cette interruption une portion de code spéciale est exécutée : le gestionnaire
de processus
11 / 42
Exemple
C'est le ordonanceur de processus qui décide quel programme a la main et pour combien
de temps (priorité aux tâches critiques par exemple)
Le système d'exploitation stocke pour chaque processus un ensemble d'informations, le
PCB (Process Control Block).
12 / 42
Proccess Control Block
Le PCB contient:
13 / 42
Opérations sur les processus
14 / 42
États d'un processus
Un processus change d'état au cours de son exécution
15 / 42
États d'un processus
L'OS détermine et modi�e l'état d'un processus:
…
◆ En fonction d'évènements externes au processus:
◆ un �chier devient disponible
◆ un timer arrive à 0
◆ le matériel déclenche une interruption
16 / 42
États d'un processus
Prêt En exécution
interruption
par l'ordonnanceur
terminaison
fin E/S
normale
int. traitée
…
En attente attente E/S
interruption
terminaison
Terminé
anormale
17 / 42
La commande ps
Permet d'avoir des informations sur les processus en cours d'exécution (voir « man ps »
pour les options):
$ ps -o user,pid,state,cmd x
USER PID S CMD
…
kim 27030 Z [chrome] <defunct>
kim 27072 S ∕opt∕google∕chrome∕chrome --type=renderer
kim 29146 S bash
kim 29834 S evince
kim 29858 S emacs cours.xhtml
kim 29869 R ps -o user,pid,state,cmd x
18 / 42
États des processus (sous Linux)
R : Running (en cours d'exécution)
S: Interruptible sleep (en attente, interruptible)
D : Uninterruptible sleep (en attente, non-interruptible)
T: Stopped (interrompu)
Z: Zombie (terminé mais toujours listé par le système)
19 / 42
Signaux
L'OS peut envoyer des signaux à un processus. Sur réception d'un signal, un processus
peut interrompre son comportement normal et exécuter son gestionnaire de signal.
Quelques signaux:
Nom Code Description
INT/TERM 2,15 demande au processus de se terminer
QUIT 3 interrompt le processus et produit un dump
KILL 9 interrompt le processus immédiatement
SEGV 11 signale au processus une erreur mémoire
STOP 24 suspend l'exécution du processus
CONT 28 reprend l'exécution d'un processus suspendu
20 / 42
Processus et terminal
Un processus est lié au terminal dans lequel il est lancé. Si on exécute un programme
dans un terminal et que le processus ne rend pas la main, le terminal est bloqué
$ gedit
On peut envoyer au processus le signal STOP en tapant
ctrl-Z
dans le terminal:
$ gedit
^Z
[1]+ Stopped gedit
Le processus est suspendu, la fenêtre est gelée (ne répond plus).
21 / 42
Processus et terminal
On peut reprendre l'exécution du programme de deux manières:
$ fg
Reprend l'exécution du processus et le remet en avant plan (terminal bloqué)
$ bg
Reprend l'exécution du processus et le remet en arrière plan (terminal libre)
On peut lancer un programme directement en arrière plan en faisant:
$ gedit &
22 / 42
Processus et entrées/sorties
Le terminal et le processus sont liés par trois �chiers spéciaux:
Dans le shell, on peut utiliser les opérateurs <, > et 2> pour récupérer le contenu de
stdin, stdout et stderr:
23 / 42
Shell et entrées/sorties
Dans le shell, l'opérateur | permet d'enchaîner la sortie d'un programme avec l'entrée
d'un autre:
$ ls -l *.txt | sort -n -r -k 5 | head -n 1
24 / 42
Fonctionnement des redirections
25 / 42
Attention à l'ordre d'exécution !
Quelques exemples de commandes problématiques :
$ sort fichier.txt > fichier.txt
fichier.txt devient vide ! Il est ouvert en écriture et tronqué avant l'exécution de la
commande.
$ sort < fichier.txt > fichier.txt
fichier.txt devient vide ! Il est ouvert en écriture et tronqué avant l'exécution de la
commande.
$ sort < fichier.txt >> fichier.txt
fichier.txt contient son contenu original, suivi de son contenu trié !
26 / 42
Quelques explications (1/2)
La commande sort doit trier son entrée standard. Elle doit donc la lire intégralement
avant de produire la moindre sortie. Pour
$ sort < fichier.txt >> fichier.txt
on a donc :
27 / 42
Quelques explications (2/2)
La commande cat ré-a�che son entrée standard sur sa sortie standard. Elle peut donc
lire le �chier morceaux par morceaux et les a�cher au fur et à mesure. Supposons que
�chier.txt contient AB :
$ cat < fichier.txt >> fichier.txt
28 / 42
Conseils…
On évitera toujours de manipuler le même �chier en entrée et en sortie. Il vaut mieux
rediriger vers un �chier temporaire, puis renommer ce dernier (avec la commande mv).
29 / 42
Enchainement de commandes et code de sortie
Sous Unix, chaque commande renvoie un code de sortie (un entier entre 0 et 255).
Par convention, un code de 0 signi�e terminaison normale, un code di�érent de 0 une
erreur. On peut enchaîner des commandes de plusieurs façons :
cmd1 ; cmd2
cmd2 est exécutée après cmd1
cmd1 && cmd2
cmd2 est exécutée après cmd1 si cette dernière réussit (code de sortie 0)
cmd1 || cmd2
cmd2 est exécutée après cmd1 si cette dernière échoue (code de sortie di�érent de 0)
30 / 42
La commande test
La commande test permet de tester des conditions sur les �chiers passés en arguments.
Si le test est vrai, la code de sortie est 0, sinon c'est 1
Les options permettent de spéci�er les tests.
31 / 42
La commande test (exemples)
L'option -f permet de tester si un �chier existe :
$ test -f toto.txt
32 / 42
Plan
1 Présentation du cours ✓
2 Le système Unix ✓
3 Le système Unix (2)
3.1 Gestion des processus ✓
3.2 Script shells
Retour sur les exécutables
On a vu qu'un �chier exécutable est censé contenir des instructions machines.
Un humain ne peut pas écrire directement des instructions machines en binaire.
34 / 42
Exécutables pour langages interprétés
Est-il possible d'écrire des programmes en shell ou en Python et d'en faire des �chiers
exécutables ?
Oui !
On procède de la façon suivante
1. On crée un �chier texte (ex: test.sh) contenant le code dans le langage choisi (par
exemple le shell)
2. On indique en début de �chier un commentaire spécial (appelé shebang) :
#!∕bin∕bash
Cette ligne commence par #! est suivie du chemin vers le programme qui interprète
le langage (bash, python3, …)
3. On rend ce �chier exécutable. On peut ensuite l'exécuter.
35 / 42
Que fait le système d'exploitation ?
Lorsque l'on essaye d'exécuter une commande :
#!∕chemin∕vers∕un∕programme
...
texte
...
Le texte du �chier est copié sur l'entrée standard du programme dont le chemin est
donné (« comme si un utilisateur avait saisi les lignes au clavier »)
36 / 42
Script Shell
On peut utiliser cette fonctionalité pour écrire des scripts shell.
37 / 42
Dé�nitions de variables
On peut dé�nir des variables au moyen de la notation
VARIABLE=contenu
et on peut utiliser la variable avec la notation $VARIABLE
i=123
j="Ma super chaine"
TOTO=titi
echo $TOTO
exemple d'utilisation: echo $j $i $TOTO
a�che « Ma super chaine 123 titi »
38 / 42
Variables spéciales
Les variables $1, $2, … contiennent les arguments passés au script sur la ligne de
commande.
La variable $0 contient le chemin vers le script en cours d'exécution
Attention, il est recommandé de toujours encadrer l'utilisation d'une variable par des
guillemets "
39 / 42
Conditionnelle
La syntaxe est :
if commande
then
...
else
...
fi
commande est évaluée. Si elle se termine avec succès, la branche then est prise. Si elle se
termine avec un code d'erreur, la branche else est prise. On peut utiliser la commande
test qui permet de tester plusieurs conditions (existance d'un �chier, égalités de deux
nombres, ...) et se termine par un succès si le teste est vrai et par un code d'erreur dans
le cas contraire
40 / 42
Exemple de script
On est dans le �chier backup.sh :
#!∕bin∕bash
INPUT="$1"
if test -f "$INPUT"
then
cp "$INPUT" "$INPUT".bak
echo "Sauvegarde du fichier $INPUT réussie"
else
echo "Erreur, le fichier $INPUT n'existe pas"
fi
On suppose que le script possède les bonnes permissions, qu'il se trouve dans le
répertoire courant, et qu'un unique �chier doc.txt se trouve dans ce même répertoire
$ .∕backup.sh doc.txt
Sauvegarde du fichier doc.txt réussie
$ ls
backup.sh doc.txt doc.txt.bak
$ .∕backup.sh toto.txt
Erreur, le fichier toto.txt n'existe pas
41 / 42
Conclusion
permission, utilisateurs, …)
42 / 42