Académique Documents
Professionnel Documents
Culture Documents
SYSTÈME D’EXPLOITATION ET
PROGRAMMATION SYSTÈME
Par: Dr TCHOUPE TCHENDJI Maurice
Université de Dschang
Objectif
2
Objectif
comprendre, décrire l’architecture et le fonctionnement des systèmes
d’exploitation
maîtriser les concepts des systèmes d’exploitation multitâches en termes d'utilisation et
de structure interne
se familiariser er avec les notions de mémoire virtuelle, de processus, de thread,
d’ordonnancement, de synchronisation de processus (en C), et à la programmation de
processus parallèles coopérants.
utiliser le SE Linux
Pré-requis
Afin de suivre ce cours sans difficulté, il serait intéressant:
d’être familier avec l’utilisation de base d’un système d’exploitation :Windows,
MS-DOS, …
de posséder quelques notions d’algorithmique
posséder une bonne habitude de la programmation en langage C
Déroulement du Cours
CM=25h, TP = 15h, TD = 5 h
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Programme
3
Théorie des SE
Définition et rôle d’un SE
Gestion des processus
Gestion de la mémoire
Gestion des fichiers
Gestion des E/S
Etude du SE Linux
Installation,
Commandes de bases
Programmation en Shell
Programmation système
Appels système de création et de gestion des processus
Appels système IPC
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Bibliographie
4
Théorie des SE
A quoi ça sert ?
à simplifier la vie des utilisateurs et des programmeurs:
machine virtuelle (abstraite)
à gérer les ressources de la machine d’une manière
efficace
Les ressources d’un ordinateur sont :
• le processeur,
• les mémoires,
• les périphériques
etc.
<ouvrir_fichier “TP/expr.txt”>
Système d’exploitation
Pilote de disquette Pilote d’imprimante Pilote d’écran
<démarrer moteur>
<lire_secteur(début_secteur_5,param1_5, param2_5,…, param12_5)>
<lire_secteur(début_secteur_0,param1_0, param2_0,…, param12_0)>
…
<lire_secteur(début_secteur_7,param1_7, param2_7,…, param12_7)>
<arrêter_moteur>
Contrôleur de disquette
Gestion de
fichiers
Gestion de Gestion de
la mémoire processus
Concept de fichier
La mémoire vive (RAM) est de taille restreinte et surtout
volatile. On a donc besoin de stocker de l’information à plus
long terme.
Les supports de stockages physiques sont divers dans leurs
technologies (magnétique/optique, bande/disque). Le
système d’exploitation va fournir une vue logique uniforme
du stockage d’information à l’aide de l’abstraction des
différentes propriétés des systèmes physiques : le fichier.
La plupart des systèmes d’exploitation vont aussi fournir un
moyen d’organiser l’ensemble des fichiers gérés par le
système grâce aux structures de répertoire et de partitions.
Sur ces abstractions vont se greffer différentes questions :
comment nommer les fichiers, comment les structurer en
répertoires, comment les utiliser, comment les protéger.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers
21
Type
Selon le système, les fichiers sont organisés en différents
types.
Normal/Ordinaire : les données des utilisateurs. C’est le
minimum. Les données contenues peuvent avoir une
structuration interne, ce n'est pas le problème du système
d’exploitation qui ne distinguera pas en général un fichier
de texte, contenant un flot d’octet d'un fichier de données
structurées ou d’un fichier contenant un programme
exécutable.
Répertoires : en général réservé au système. Permet
d’organiser une interface utilisateur donnant la vision d’une
arborescence.
Spéciaux : représentant des périphériques en mode bloc ou
caractères.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Types de fichiers
ASCII binaires
(contiennent du (même textuels, e.g. .doc,
texte ascii pur) car ils ont des structures
internes propres aux
programmes qui les créent)
Problème de l’ambiguïté de la « fin de ligne » :
• CR
• LF
• CR + LF (sous MS-DOS)
• Un lien symbolique est un fichier à part entière (sous Linux il a son propre i-node
différent de celui du fichier lié) qui contient le chemin d’accès au fichier lié.
• Un lien dur est le rattachement du même fichier physique (même i-node sous Linux) à
un autre (ou au même) répertoire.
Attributs
La plus petite des commodités que fournit un système aux utilisateurs est
de pouvoir nommer le fichier. La structure des noms est variable d’un
système à l’autre. Certains systèmes font des hypothèses selon la
structure du nom, certains systèmes reconnaissent la différence entre
majuscules et minuscules. Chaque système autorise une taille maximale
de nom.
D’autres attributs varient d’un système à l’autre :
Type : certains systèmes ont besoin de connaître le type du fichier.
Emplacement :
Nom du programme créateur :
Taille : la taille courante du fichier (octets, mots ou blocs). D’autres tailles sont
éventuellement incluse : taille maximale, taille sur le disque.
Protection : informations de contrôle d’accès vérifiant qui peut lire, écrire,
exécuter le fichier.
Informations horaires : de nombreuses informations de date et d’heure sont
en général conservées.
Créateur, Propriétaire .
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Nommage des fichiers
Distinction entre les Longueur Longueur
SE majuscules et les maximale d’un maximale d’une
minuscules nom de fichier extension
Unix/Linux Oui 255 255
MS-DOS Non 8 3
Windows 95 Non … …
Windows 98 Non … …
Opérations
Le fichier est vu par les programmes comme un type de
données abstrait. Le système fournit un ensemble
d’opérations permettant de manipuler les fichiers. Ces
opérations sont implémentées sous forme d’appels système.
Créer (create): le système doit d’abord trouver de la place dans
le système de fichier. Il doit créer une entrée dans la table des
répertoires pour mémoriser le nom du fichier, ses attributs et son
emplacement sur le disque.
Effacer (delete): le système doit rechercher le fichier dans le
système de fichiers. Il doit libérer l’espace occupé par le fichier
et effacer l’entrée dans le répertoire.
Lire (read): le système doit trouver le fichier, et y lire. Le système
mémorise un pointeur indiquant l’emplacement dans le fichier ou
aura lieu la prochaine lecture.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers
28
Opérations
Ecrire (write): le système doit trouver le fichier, et y écrire.
Le système mémorise un pointeur indiquant l’emplacement
dans le fichier ou aura lieu la prochaine écriture. En
général, un seul pointeur sert en réalité à la lecture et à
l'écriture
Ouvrir (open):
Fermer (close):
Ajouter (append):
Positionnement (seek):
Lire les attributs (get attributes) :
Ecrire les attributs (set attributes) :
Renommer (rename):
Répertoires
L’organisation des fichiers en répertoires permet de résoudre (partiellement ?) le
problème de la complexité de la recherche d’un fichier déterminé. Cette
organisation est généralement réalisée en deux parties, les partitions (aussi
nommées volumes, ou mini-disques) et les répertoires.
Les partitions permettent de cacher aux utilisateurs le détail de la structure
physique des disques. Une partition permet de découper un disque en plusieurs
parties logiques, ou au contraire de rassembler plusieurs disques en une même
partie logique. Les fichiers et répertoires résident dans la partition.
Les répertoires mémorisent les informations sur les attributs des fichiers qui y
sont contenus. Certains systèmes de fichiers n’offrent un répertoire qu’à un seul
niveau, mais la plupart ont en plus une structure logique à deux ou plusieurs
niveaux. Dans ce cas, un fichier est repéré non seulement par son nom, mais aussi
par sa position dans l’arborescence des répertoires. Cette dernière peut être
repérée par son chemin absolu, à partir de la racine de l’arbre, ou par son
chemin relatif, à partir de la position courante dans l’arbre.
De la même façon que pour les fichiers, un ensemble d’appel systèmes permet
de manipuler la structure des répertoires : rechercher un fichier, énumérer le
contenu du répertoire, parcourir l’arborescence du système de fichier, connaître
la position courante dans l’arbre.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Répertoires
30
Sur les SE modernes les fichiers sont organisés en une structure hiérarchique.
L’identification d’un fichier se fait par son nom précédé d’un chemin absolu (c-
à-d par rapport à la racine de l’arborescence) ou relatif (c-à-d par rapport au
répertoire courant).
Une structure hiérarchique n’est pas forcément un arbre, ça peut être un
graphe acyclique (à cause des liens multiples).
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers
31
Protection
La protection des données des utilisateurs peut s’entendre de plusieurs
manières.
La protection contre les dégâts physiques (effacement, problèmes de
relecture, erreurs du logiciel de système de fichiers,.) relève plutôt du concept
de fiabilité.
Dans ce cours, nous traiterons plutôt de la protection contre un usage malveillant
des données. Le besoin de protection est évidemment lié à l’aspect multi-
utilisateur du système. Dans un système mono-utilisateur, la meilleure protection
consiste à enlever les disquettes et à les enfermer à clé dans le tiroir.
La protection doit porter sur les opérations de bas niveau des fichiers :
Lecture ,
Ecriture,
Ajout,
Destruction,
Enumération
Protection
On peut bien entendu mettre en place diverses autres protections
(renommer, copier, .). Celles ci feront toujours appel aux
opérations de bas niveau. A noter que la copie d’un fichier est en
général mal protégée dès lors qu’on sait lire le fichier.
La protection des fichiers se fait en général par deux méthodes,
parfois utilisées en conjonction.
La méthode la plus simple consiste à associer un mot de passe à un
fichier, ou un répertoire. Bien que présentant d’assez nombreux
problèmes, elle reste encore la seule utilisable sur certains systèmes.
La méthode plus classique repose sur l’existence de listes de contrôle
d’accès. Elle repose sur l’identification des utilisateurs du système et le
regroupement de ces utilisateurs en groupes auquel on ajoute en
général un groupe particulier représentant l’ensemble des utilisateurs
du fichier: l’univers.
A chaque fichier, répertoire, voire objet du système d’exploitation est
ensuite associé un attribut qui spécifie le nom de l’utilisateur (du groupe) et
les droits associés à cet utilisateur (ce groupe).
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers: allocation
33
Méthodes d’allocation
Allocation contiguë : Chaque fichier occupe un bloc contigu sur le disque. Méthode
simple, mais coûteuse en temps (recherche d’espace libre) et en espace disque
(fragmentation rapide du disque). Méthode bien adaptée aux bandes magnétiques.
Allocation chaînée : Chaque fichier est une liste chaînée de blocs disques; les blocs
pouvant être dispersés partout sur le disque. On ne perd pas de place, mais la lecture des
fichiers autrement que séquentiellement est extrêmement compliquée. Variante optimisée
avec par exemple la FAT de MSDOS, grâce à la table d’allocation des fichiers.
Allocation indexée : L’allocation indexée corrige le problème de la difficulté des accès
séquentiels en regroupant tous les pointeurs dans un seul emplacement, le bloc index.
Chaque fichier possède son propre bloc index, qui est un tableau d’adresses de blocs
disques. Quand le fichier est crée, tous les pointeurs sont fixés à nul, et les entrées sont
remplies au fur et à mesure de l’allocation de blocs au fichier. Bien entendu, ce système
souffre de la surcharge due à la nécessité de ce bloc d’index pour tous les fichiers.
Allocation par inodes : L’allocation par inodes d’Unix corrige les effets pervers de
l’allocation indexée en ne réservant de la place dans la table d’index que pour les
premiers pointeurs dans le bloc index.
Contrôles d'accès
On distingue trois classes d’utilisateurs :
le propriétaire (u : user, par défaut créateur),
le groupe (g : group, par défaut groupe principal du
créateur) et
le reste du monde (o : others).
Chaque classe peut se voir affecter sur un fichier les
droits
de lecture (r : read),
d’écriture (w : write) et
d'exécution (x : execute).
Contrôles d'accès
Contrôles d'accès
La commande ls -l permet de connaître le détail des droits sur un
fichier: le type de fichier (catalogue, fichier ordinaire ou spécial),
les droits d'accès pour les différents utilisateurs, le nombre de lien
du fichier, les noms du propriétaire et du groupe, la taille du
fichier en nombre de caractères et la date de dernière
modification
ls -l /etc/passwd
-r--r--r-- 1 root sys 8620 Jan 21 12:41 /etc/passwd
ls -l /bin/passwd
-rwsr-sr-x 1 root sys 16686 Jul 30 12:41 /bin/passwd
La commande passwd (fichier/bin/passwd) a le "set-uid" bit positionné
(indication s en lieu et place de x pour le bit exécution par le
propriétaire) et donc au travers de cette commande tout utilisateur peut
modifier le fichier /etc/passwd (en l'occurrence changer son mot de
passe.)
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers: LE SGF D’UNIX
44
Contrôles d'accès
La commande chmod permet de modifier les droits sur un fichier (noter la descente
récursive d’une sous arborescence avec l’option -r). ) pour pouvoir l’utiliser sur un fichier, il
faut en être le propriétaire.
Syntaxe: chmod <mode> <reférenceFichier>
Il existe deux syntaxe: la notation symbolique et la notation octale
notation octale: Les modes peuvent être absolus et sont alors obtenus par combinaison des
nombres octaux
4000 positionne le "set-uid" bit
2000 positionne le "set-gid" bit
1000 positionne le "sticky" bit
0400 lisible par le propriétaire
0040 lisible par les membres du groupe propriétaire
0001 exécutable par les autres utilisateurs
…
exemple
$ chmod 664 exemples/toto
$ ls -l exemples/toto
-rw-rw-r-- 1 jmr ens 84 Jan 27 19:09 exemples/toto
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers: LE SGF D’UNIX
45
Contrôles d'accès
La commande chmod permet de modifier les droits sur un fichier (noter la descente récursive d’une sous arborescence
avec l’option -r). ) pour pouvoir l’utiliser sur un fichier, il faut en être le propriétaire.
Syntaxe: chmod <mode> <reférenceFichier>
Il existe deux syntaxe: la notation symbolique et la notation octale
notation symbolique: les modes peuvent être symboliques et ils ont alors la forme:
[<quit>] <permission> <operation>
<quit> est une combinaison des lettres: u pour le propriétaire, g pour le groupe, o pour les autres,
a pour tous.
<permission> est: + pour autoriser, - pour interdire, = imposer certaines permissions et supprimer
les autres;
<opération> est une combinaison des lettrez: r pour lire, w pour écrire, x pour exécuter, s pour le
"set-uid" (bit associé à u) ou le "set-gid" (associé à g); t pour le "sticky" bit.
Exemples:
$ ls -l exemples/toto
-rw-r----- 1 jmr ens 84 Jan 27 19:09 exemples/toto
$ chmod go+r exemples/toto
-rw-r--r-- 1 jmr ens 84 Jan 27 19:09 exemples/toto
Contrôles d'accès
chown permet de modifier le propriétaire d’un fichier,
syntaxe: chown <nom> <refFich>
Exemple:
$ chown root exemples/toto
$ ls -l exemples/toto
-rw-rw-r-- 1 root ens 84 Jan 27 19:09 exemples/toto
Recherche de fichiers.
find permet de rechercher un ou des fichiers dans le
système de fichier. On recherche récursivement, en
partant d’un répertoire des fichiers ou des répertoires
suivant certains critères (nom de fichier, éventuellement
avec joker, type de fichier, nom de l’utilisateur ou du
groupe, droits d’accès, type de fichier).
test peut entre autres opérations, tester les
caractéristiques d’un fichier et renvoyer une valeur de
retour 0 si vrai et 1 si faux. Très utile dans les scripts de
langage de commandes (nous en reparlerons).
stdout stdout
0 1 stdin
0 1 fichier
stdin
Processus
Processus
2 stderr 2 stderr
mardi dimanche
Processus exécutant
wc –l <f1
Processus exécutant
lundi hier
demain lundi
lundi mardi 5
>f2
dimanche
2 stderr 2 stderr
Processus exécutant
wc –l <f1
Processus exécutant
lundi
demain
lundi 5
>f2
dimanche
2 stderr 2 stderr
Les inodes
Chaque fichier est représenté par une structure nommée inode.
Un inode contient la description (pour le SGF) d’un fichier:
Propriétaire, groupe, type de fichier, permissions
Date d.accès, de modification et de dernier accès à l.inode
Taille
Description des blocs constituant le fichier
Etat de l’inode
N° de périhérique logique
N° de l’inode
Pointeurs sur d’autres inodes en mémoire
Compteur de référence indiquant le nombre d’instances du fichier
actuellement ouvertes
Zone de verrous
Les inodes
Chaque inode permet de retrouver l’ensemble des blocs de données
constituant un fichier.
Une première série de 10 entrées contiennent chacune le numéro de
bloc d’un bloc de données du disque.
Simple indirection : une onzième entrée contient le numéro d.un bloc de
données qui contient lui même 256 entrées référençant chacune un bloc de
données du disque.
Double indirection : une douzième entrée contient le numéro d.un bloc de
données qui contient lui même 256 entrées référençant chacune un bloc de
données qui contient 256 entrées référençant chacune un bloc de données du
disque.
Enfin triple indirection : une treizième entrée contient le numéro d.un bloc de
données qui contient lui même 256 entrées référençant chacune un bloc de
données qui contient 256 entrées référençant chacune un bloc de données qui
contient 256 entrées référençant chacune un bloc de données du disque.
Les inodes
Les inodes
Remarque : Un fichier peut avoir plusieurs liens donc
plusieurs noms. Il suffit pour cela qu’ils pointent sur le
même inode (celui du fichier).
L’inode n°2 est l’inode racine du système de fichiers.
Répertoires
Un répertoire est un fichier comme les autres.
Chaque répertoire peut contenir des fichiers ou des
répertoires.
Les répertoires sont structurés en arbre hiérarchique (plus
exactement en graphe sans cycle).
Les données contenues dans un fichier de type répertoire
sont une suite d’éléments contenant chacun un numéro
d’inode et le nom du fichier.
Lorsque un processus a besoin d’un fichier, le noyau parcourt
les différents répertoires jusqu’à trouver le nom recherché.
Celui-ci fournit alors un numéro d’inode, qui est chargé en
mémoire et utilisé dans la suite du processus.
Les caractères suivants sont spéciaux – ils servent d’opérateurs aux expression
régulières.
. ? * + { } , - [ ] ^ $ \ |
Un caractère spécial
précédé de ‘\’ Décrit ce même caractère \$ $
(«déspécialisé»)
Décrit un caractère
Le caractère spécial ‘.’
quelconque
. a, b, c, A, 6, ^, <tab> …
Les expressions décrivant des classes de caractères sont aussi des expressions
régulières atomiques :
Expression Séquences atomiques
régulière Signification correspondantes au
atomique motif
[:digit:] décrit les chiffres décimaux 0, 1, …, 9
[:xdigit:] décrit les chiffres hexadécimaux 0, 1, …9, A, .., E, a,…, e
[:alpha:] décrit les lettres a, b, …, z, A, B, …, Z
[:upper:] décrit les lettres majuscules A, B, …, Z
[:lower:] décrit les lettres minuscules a, b, …, z
décrit les caractères alphanumériques (lettres
[:alnum:] A, …z, A,…, Z, 0, …, 9
et chiffres)
[:space:] décrit le caractère d’espacement
[:print:] décrit les caractères imprimables
[:cntrl:] décrit les caractères de contrôle
[:punct:] décrit les caractères de ponctuation , .:;?!’…
69
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Expressions régulières (« étendues ») (1/3)
Une expression régulière est l’une des suivantes (tableau sur 3 pages) :
Exemples de Séquences
Expression régulière Signification motifs correspondantes
au motif
… N occurrences du motif
Une ER suivie de {N}
précédent
(ab){2} abab
? + { } | ( )
Afin de le convertir en meta-caractères il faut les faire précéder par un ‘\’ :
\? \+ \{ \} \| \( \)
Exemple : l’ER simple suivante décrit les séquences abbc, abbbc, abbbbc,…
a b \{2,\}c
Support : Programmation système et environnement Unix // Par: Dr Maurice
73TCHOUPE T. (UDS)
Filtres
Exemples :
• Lire un fichier et afficher uniquement celles de ses lignes qui contiennent un
certain motif :
grep ‘200[0123]’ dates #Afficher toutes les lignes contenant 2000, 2001, 2002,
2003
• Lire un fichier et remplacer chaque occurrence d’un motif recherché par un
autre motif :
sed ‘s/a$/A’ exemple #Remplacer chaque ‘a’ en fin de ligne
#par un ‘A’
Gestion de processus
84
Programme C Processus C
Programme B Processus B
temps
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Algorithmes d’ordonnancement (1/2)
85
Après le quantum de P1 :
P5 P3 P2 P3 P4 P5 P6 P1
P4
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Algorithmes d’ordonnancement (1/2)
86
1. Tourniquet avec priorité : les processus attendent dans plusieurs files selon
leurs priorités. La file de la plus grande priorité est servie d’abord. A
l’intérieur d’une file l’ordonnancement se fait selon la méthode de tourniquet.
Processus prêts
Têtes de files
Priorité 4 (Priorité la plus élevée)
Priorité 3
Priorité 2
Priorité 1 (Priorité la plus basse)
8 4 4 4 4 4 4 8
A B C D B C D A
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Temps moyen = (8+12+16+20)/4 = 14 Temps moyen = (4+8+12+20)/4 = 11
Etats d’un processus
88
ETATS
Elu (running) = en cours
d’exécution TRANSITIONS
Prêt (ready, runnable) = Elu 1 = le processus se
2 bloque en attente
suspendu
temporairement pour d’événement
3
permettre l’exécution 1 Prêt 2 = l’ordonnanceur
d’un autre processus choisit un autre
Bloqué (blocked) = processus
attendant un événement 3 = l’ordonnanceur
extérieur, e.g. appui Bloqué 4 choisit ce processus
d’une touche au clavier, 4 = l’événement
pour pouvoir continuer attendu survient
après I1
Fich.c TP17.c CV.doc Test.ps
après I2
F_b dans [qb]> //I2 Fich.c TP17.c CV.doc Test.ps F_b
5 6 7 8 9
après I3
Fich.c TP17.c CV.doc Test.ps F_b
Processus C : qb 9 5 6 7 8 9
Fich.c TP17.c CV.doc Test.ps F_b
après
<qc queue> //I1c qc 9 I2b
<charger fichier tête queue
F_c dans [queue]> //I2c qb 9 5 6 7 8 9
<queue qc+1> //I3c Fich.c TP17.c CV.doc Test.ps F_c après
Support : Programmation système et qc 9 Unix
environnement I2c
// Par: Dr Maurice TCHOUPE T. (UDS)
tête queue
Conflits d’accès aux variables partagées (2/2)
Processus B : qb 9 5 6 7 8 9
96<qb queue> Fich.c TP17.c CV.doc Test.ps F_c
après
qc 9 I3b
//I1b
tête queue
<charger fichier
F_b dans [queue]> //I2b qb 9 5 6 7 8 9
<queue qb+1> //I3b Fich.c TP17.c CV.doc Test.ps F_c
après
qc 9 I3c
Processus C : tête queue
<qc queue> //I1c Problème : Le fichier F_b ne sera jamais imprimé,
<charger fichier car il a été écrasé par F_c.
F_c dans [queue]> //I2c Source du problème : la variable partagée queue
<queue qc+1> //I3c est lue est modifiée par deux processus à la fois.
Les conflits d’accès concurrents aux variables partagées ont plusieurs solutions
possibles (sémaphores, moniteurs, …).
L’idée commune de ces solutions est l’exclusion mutuelle : une variable partagée ne
doit pas être lue ni modifiée par plus d’un processus à la fois. Si d’autres processus
veulent y accéder ils doivent attendre que le premier //
Support : Programmation système et environnement Unix
processus ait fini.
Par: Dr Maurice TCHOUPE T. (UDS)
Echange de messages
97
Les mécanismes de communication par variables partagées conviennent bien à
des processus qui tournent sur le même processeur ou sur plusieurs processeurs
possédant une mémoire commune.
Pour les systèmes distribués, i.e. constitués de plusieurs processeurs ayant chacun
leur propre mémoire et reliés par un réseau local, la communication inter-
processus peut se faire par échange de message :
• Un processus peut envoyer un message par réseau à un destinateur précis :
send(destination, message)
• Un autre processus peut “consommer” un message par :
receive(source, message)
• Les problèmes qui se posent :
– Perte de message lors du passage par réseau - nécessité d’acquittement
– Perte d’acquittement - nécessité de retransmission d’un message
– Reconnaissance d’un message envoyé 2 fois (à cause de perte
d’acquittement)
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
– Authentification des processus envoyant et recevant le message, etc.
Threads (processus légers)
98
texte
processus
thread
2
clavier
pile du pile du disque
thread
Support : Programmation système et environnement Unix //
thread
Par: Dr Maurice TCHOUPE T. (UDS)
1 3
100
• L’appel système fork crée une copie conforme du processus parent (celui
qui invoque le fork). Le processus parent et l’enfant possèdent leur propres
images mémoires – la modification d’une variable par le parent n’influe pas
sur l’enfant et inversement.
• Le processus fils exécute donc le même programme que le père, à partir de
l’endroit le l’appel de fork.
• Le processus connaît sont statut (père ou fils) grâce au résultat du fork, qui
renvoit 0 au fils et le PID du fils au père.
• La changement du programme à exécuter peut se faire par l’appel système
execve(noms, params, env).
• Le processus fils hérite des fichiers ouverts du père.
pid = fork();
//Fork peut échouer (par exemple par saturation
//de la mémoire ou de la table de processus)
if (pid < 0)
handle_error();
else
//Fork revoit au père le PID de son fils
if (pid > 0)
/*Ici est placé le code du père*/
//Fork revoit 0 au fils
else
/*Ici est placé le code du fils*/
#include <signal.h>
main(){
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
for( ; ;); /*boucle infinie*/
}
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Quelques programmes sur les processus
117
• On peut facilement vérifier le comportement depuis sa console pour les deux signaux SIGINT et
SIGQUIT et en utilisant une seconde console pour SIGUSR1 et SIGUSR2 (kill -16 <pid> ou kill -17
<pid>).
• OnSupport
peut aussi vérifier que
: Programmation les comportements
système par défaut sont //
et environnement Unix rétablis
Par: Dr Maurice TCHOUPE T. (UDS)
Quelques programmes sur les processus
119
• On peut aussi vérifier que les comportements par défaut sont rétablis
• Si on ne veut pas que ce soit le cas, la fonction exécutée lors de la réception doit prévoir un appel
à la primitive signal afin de positionner les valeurs des déroutements. Sur notre exemple, les
fonctions supp et message s'écriraient:
supp(int n){
unlink(nom);
printf("n=%d\n", n);
if (n==SIGQUIT){
printf("SIGQUIT recu\n");
exit(1);
}
message(int n){
signal(SIGUSR1, message); else {
signal(SIGUSR2, message); signal(SIGINT, supp);
printf("signal SIGUSR1 %d bien recu\n", n); printf("SIGINT recu\n");
} }
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
}
Quelques programmes sur les processus
120
Paramètres
Les paramètres sont initialisés si on les tape à la suite du
nom du fichier.
Ils portent les numéros de 1 à 9 précédés du $.
$1 est une expression dont la valeur est celle du premier
paramètre effectif placé après une commande simple.
$2, pour le deuxième, . et
$9 pour le neuvième.
$0 existe et désigne la commande elle-même.
Notons, tout de suite, que cette technique ne limite pas le
nombre de paramètres à 9, comme nous le verrons par la
suite.
Boucle while
while liste_de_commandes_1
do NUM=0
while [ $1 ] #tant que $1 existe, [ ] commande test
liste_de_commandes_2 do
done NUM=`expr $NUM + 1`
La liste_de_commandes_1 est echo "paramètre $NUM = $1"
exécutée. Si le code de retour shift #décale les paramètres
de la dernière commande de done
liste_de_commandes_1 est 0
(vrai), alors la
liste_de_commandes_2 est
exécutée et la boucle continue.
boucle until
until liste_de_commandes_1
do NUM=0
liste_de_commandes_2 until [ $# -eq 0 ] #jusqu’à ce que le nombre de
done #paramètres soit nul
do
La liste_de_commandes_1 est
exécutée. Dès que le code de NUM=`expr $NUM + 1`
echo "paramètre $NUM = $1"
retour de la dernière
shift #décale les paramètres
commande de
liste_de_commandes_1 est 0 done
(vrai), la liste_de_commande_2
n’est plus exécutée et la boucle
s’arrête.
Sélection if
if liste_de_commandes_1
then
liste_de_commandes_2
else
liste_de_commandes_3
fi
On teste le code de retour de la dernière commande de
liste_de_commandes_1 ;
s’il est égal à 0, liste_de_commandes_2 est exécutée
sinon c’est liste_de_commandes_3 qui l’est.
L’existence de else liste_de_commandes_3 n’est pas obligatoire.
Le code de retour de la structure est 0 si liste_de_commandes_2 est
exécutée sinon c’est celui de la dernière commande de
liste_de_commandes_3.
Sélection case
Exemple : Préciser si le paramètre est un chiffre, une lettre
ou une suite de caractères.
NUM=0
for PARAM in $*
do
NUM=`expr $NUM + 1`
case $PARAM in
[0-9]) echo "le paramètre $NUM est un chiffre: $PARAM" ;;
[a-z]|[A-Z]) echo "le paramètre $NUM est une lettre: $PARAM" ;;
*) echo "le paramètre $NUM contient plusieurs caractères: $PARAM";;
esac
done
Commandes internes
Une commande interne est une commande prédéfinie dans le shell pour
laquelle il n’existe pas de fichier exécutable portant son nom.
pwd imprime le répertoire courant
cd change de répertoire
mkdir crée un répertoire
rmdir supprime un répertoire
echo affiche ses arguments
read lit une entrée au clavier
export « export » une variable (la rend visible au processus appelant)
break sortir d’une boucle (for, .).
continue continuer à l’itération suivante d’une boucle (for, ..).
exit quitter le programme avec, en code de retour, celui de la dernière
commande exécutée (fin du shell en cours).
return idem pour quitte
shift les paramètres formels sont renommés: $2->$1 ; $3->$2... Utile lorsqu’une
commande a plus de 9 paramètres . On a déjà noté que les paramètres formels d’une
commande sont désignés par des chiffres et ce sont des paramètres de position : 0
représente le nom de la commande paramétrée, 1 le premier paramètre, 2 le
deuxième et ainsi de suite jusqu’à 9. La notation $* est équivalente à "$1$2...", tandis
que la notation $@ est équivalente à "$1""$2".... On rappellera que $# renvoie le
nombre de paramètres de la commande
test expr délivre la valeur 0 si l'expression est vraie
Commandes externes
Toutes les commandes peuvent être utilisées dans les scripts shell.
Certaines commandes sont des grands classiques des scripts :
awk recherche d'expressions régulières et enchaînement d.action
si trouvées .
grep recherche d'expressions régulières et impression de la ligne
les contenant
wc compte de mots
sort tri
bc calculateur
PARENTHESAGES
Les parenthésages servent à regrouper des séquences de mots ou à isoler des mots.
Ils sont multiples et ont des significations spécifiques:
{...} regroupement de commandes, parenthésage ordinaire ; délimite aussi la portée de
l’opérateur de prise de valeur $.
(...) entoure une liste de commandes qui sont exécutées par un nouveau processus UNIX.
’...’ (quotes) parenthésage dans lequel aucun caractère, sauf ’, n’a de signification spéciale.
"..." (guillemets) parenthésage dans lequel aucun caractère, sauf ‘ " et $ n’a de signification
spéciale.
‘...‘ (accents graves) exécution de la phrase placée entre les accents graves; délivre la sortie
standard des commandes situées dans ce parenthésage. Les caractères spéciaux à l’intérieur du
parenthésage ne sont interprétés qu’à l’exécution de la phrase.
Le rôle des parenthésages par ’ et " est d’éviter une utilisation fastidieuse du
caractère \ quand il faut banaliser plusieurs caractères spéciaux dans une
commande. Bien entendu, on ne peut pas banaliser le caractère quote dans un
parenthésage quote, ni le caractère guillemet dans un parenthésage guillemet.
SOUS-PROGRAMMES
Procédure
Un texte écrit en shell et stocké dans un fichier constitue une procédure shell.
Dans le texte, les paramètres formels ont pour noms 1, 2...9 et leurs valeurs sont désignées par
$1,..., $9.
L’activation de la procédure peut se faire en exécutant la commande sh suivie du nom du fichier
(avec certaines options si l’on veut) ou en rendant le fichier exécutable ce qui fabrique une
nouvelle commande appelée sous-programme shell.
Fonction
Une fonction est un sous-programme local à un processus shell.
Elle n’est pas exécutée par un nouveau processus shell et n’est pas stockée seule dans un fichier.
Elle se déclare, un peu comme en C, dans le programme qui l’utilise :
nom()
{
corps de la fonction
}
SOUS-PROGRAMMES
Les parenthèses ne servent qu’à distinguer le nom d’une fonction du nom d’une
variable.
Exemple:
L’exemple suivant reprend l’écriture d’un programme shell utilisant 3 fonctions (menu, erreur et
traitement) appelées par un programme principal.(sélection if). Ce programme réclame un
paramètre, et seulement un, et celui-ci doit être obligatoirement un fichier ordinaire. Le
programme principal effectue ces vérifications, appelle menu et traitement si c.est correct
sinon lance erreur qui affiche le message correspondant à l'erreur faite.
Processus exécutant
Après avoir effectué les éventuelles substitutions de paramètres,
le shell traite les redirections,
puis examine le premier mot de la commande.
S’il est suivi d’un signe = cela signifie que c’est une affectation de
variable.
S’il correspond à une commande interne, à une commande structurée
(for, if...) ou à une activation de fonction, la commande est exécutée
dans le processus shell en cours.
Dans le cas contraire, il y a création d’un nouveau processus auquel
est passée en paramètre la commande.
Les règles de recherche des commandes sont fixées par la variable
PATH qui est initialisée à la connexion.
Paramètres de la commande sh
Lorsqu’un processus est créé par la commande sh, plusieurs
options définissant le mode d’exécution peuvent être indiquées.
Les plus utiles sont :
-v imprime les lignes telles qu’elles sont lues par le processus
shell
-x imprime les commandes telles qu’elles sont exécutées, après
les substitutions de paramètres.
Elles sont très intéressantes pour détecter d’éventuelles erreurs
de syntaxe. On les utilise de la manière suivante : sh -v proc.
On peut aussi les inclure dans un fichier shell en écrivant dans
la procédure : set -v ou set -x
EDITEURS DE TEXTE
ed : si, si . a le gros avantage d'être indépendant de toute implémentation
graphique .
vi : éditeur de texte standard sous n'importe quel Unix . Version X (vim) sous
Linux
emacs : un autre éditeur de texte.
xedit : standard sous les systèmes X
nedit, kedit, . : nombreux éditeurs de texte sous linux !
Attention ! : Dans le contexte ou nous travaillons (découverte des commandes,
programmation, .), il est fortement décommandé d'utiliser des traitements de
texte, qui vont ajouter des caractères parasites dans le fichier, le rendant
inutilisable pour le compilateur.
COMPILATION
gcc ou cc : compilation d'un programme C
f77 : compilation d'un programme fortran
g++ : compilation d'un programme C++