Vous êtes sur la page 1sur 167

COURS INF702 :

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

 Tanenbaum A. Systèmes d’exploitation, Pearson Education, Paris


2003, 2e éd.
 Armspach, J.-P.,Colin, P., Ostré-Waerzeggers, F. LINUX.
Initiation et utilisation, Dunod, Paris 2004
 Garrels, M. Bash Guide for Beginners, téléchargeable sur The
Linux Documentation Project, http://www.tldp.org/guides.html ;
où sur le réseau pédagogique R:/GTR/savary
 Cooper, M. Advanced Bash-Scripting Guide, plus complet que
le précédent, sur le même site.
 Chiesa Jean Yves , support d cours Système, Université de Rouen
 De nombreuses références internet

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


5

Théorie des SE

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Définition et rôle d’un SE
6

 Un système informatique, qu’est ce que c’est ?

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Définition et rôle d’un SE
7

 En anglais « Operating System (OS) »


 Qu’est-ce que c’est ?
« Programme assurant la gestion de l’ordinateur et de
ses périphériques » [www.dicofr.com]
 C’est une couche logicielle, dont le rôle est de gérer les
périphériques et de fournir aux programmes utilisateur
une interface simplifiée avec le matériel.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Définition et rôle d’un SE
8

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Système d’exploitation en tant que machine
virtuelle (1/3)
9

 L’architecture au niveau du langage machine est lourde à


programmer, surtout pour les entrées/sorties.
 Par exemple, dans les contrôleurs de disquette des PC actuels
une opération basique de lecture exige 13 paramètres de bas
niveau compactés dans 9 octets. Ces paramètres précisent :
 L’adresse du bloc qui doit être lu

 Nombre de secteurs par piste

 Longueur de l’espace inter-secteur

 etc.

 Sans l’existence du SE un programmeur devrait connaître tous ces


détails et les indiquer explicitement pour chaque lecture sur
disquette.
 De plus il devrait personnellement contrôler les arrêts et
redémarrages du moteur du lecteur disquette.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Système d’exploitation en tant que machine
virtuelle (2/3)
10
appel système
Programme utilisateur

<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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Système d’exploitation en tant que machine
virtuelle (3/3)
11

 Le système d’exploitation présente au programmeur une interface d’accès


aux ressources de l’ordinateur (sous forme d’appels système).
 Grâce à cette interface le programmeur peut faire abstraction des détails
de fonctionnement des ressources (comme ceux listés sur le transparent
précédent).
 Cette interface est basée sur des objets abstraits dont les plus importants
sont les fichiers et les processus.
 Exemple :
 Le programmeur voit un disque comme une collection de fichiers qui
peuvent être ouverts, lus, écrits et fermés.
 Le SE gère l’allocation de secteurs aux fichiers, le chargement des
fichiers en mémoire, la cohérence entre les fichiers en mémoire et leur
copies sur le disque, le chargement et déchargement des pages (dans
le cas de la mémoire virtuelle), etc.
 Ces actions sont transparentes pour le programmeur, c’est-à-dire il n’est
pas obligé de les connaître pour se servir du disque.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Définition et rôle d’un SE
12

 Le système d’exploitation en tant que machine


virtuelle se présente comme une couche logicielle qui
permet l’utilisation du matériel et coordonne les
différents programmes d’application.
 Le but est aussi de rendre l’ensemble transparent et
facile à utiliser vis à vis de l’utilisateur (IHM).

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Tâches du système d’exploitation - résumé
13

Gestion de
fichiers
Gestion de Gestion de
la mémoire processus

Gestion Gestion des


d’utilisateurs entrées/sorties

Les programmes utilisateur peuvent accéder à ces différentes fonctionnalités à


l’aide des appels système.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Définition et rôle d’un SE
14

 FONCTIONS D’UN SYSTEME D’EXPLOITATION ABORDEES DANS


LE COURS
 Gérer les processus, leur existence simultanée, leur coexistence dans la
mémoire centrale, le temps qui leur est alloué.
 Fournir aux processus les moyens d’accès à toutes les ressources en
terme de mémoire et d’entrées sorties dont ils ont besoin. Chaque
processus doit pouvoir s’imaginer qu’il dispose de la machine toute
entière.
 Offrir une interface d’utilisation la plus conviviale possible. Cela inclut
l’IHM (langage de commande, interface graphique), mais aussi le
système de fichiers, qui permet de gérer la permanence des données
entre les exécutions de programme.
 Optimiser l’utilisation des différents éléments composant le système
informatique, disques, mémoire, périphériques et capteurs divers. C’est
le rôle du sous système d’entrées-sorties.
 Offrir une interface de programmation la plus simple et la plus
puissante possible.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
STRUCTURE D’UN SYSTEME
15
D’EXPLOITATION MODERNE : UNIX

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


STRUCTURE D’UN SYSTEME
16
D’EXPLOITATION MODERNE : UNIX
 Caractéristiques
 Le noyau (kernel) : ensemble de fonctions système assurant la
gestion de la mémoire, des E/S et des processus.
 Un système de fichiers hiérarchisé.
 Un/plusieurs interpréteurs de commandes (shell).
 Processus asynchrones (arrière plan).
 Réentrant (partage du "texte") texte=instruction.
 Mécanisme de communication (synchronisation).
 E/S généralisées (intégrées au SGF).
 Ré allocation (redirection) des E/S et d’un processus.
 Nombreux utilitaires de programmation.
 Mécanisme de protection de mémoire en cas d’erreur de
programmation.
 Interfaces utilisateurs graphiques
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Qu’est ce que la programmation système ?
17

Définition selon Wikipédia, l'encyclopédie libre :


 La programmation système est un type de programmation qui vise au
développement de programmes qui font partie du système d'exploitation d'un
ordinateur ou qui en réalisent les fonctions.
 Elle se distingue de la programmation des applications en ce qu'elle s'intéresse
non pas au traitement des données, mais aux interfaces, aux protocoles et à la
gestion des ressources, telles que le temps et l'espace.
Elle inclut, en outre, l'accès aux fichiers, la programmation du clavier, de
l'écran, des modems, la programmation réseau, et, en général, la
programmation de tous les périphériques qui font entrer ou sortir de
l'information d'un ordinateur, de la mémoire vive et des processeurs.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


18

Système de fichiers UNIX/Linux

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Concepts de base

• Arborescence des répertoires et fichiers


• Chemins absolu et relatif (‘/’ pour séparer les répertoires dans un chemin)
• Liens durs et symboliques
• i-nodes (structure, ayant un identifiant unique, contenant les adresses des
blocs disque du fichier)
• Tous les périphériques sont modélisés comme fichiers spéciaux caractère
(périphériques série: clavier, imprimante…) ou fichiers spéciaux bloc
(disques). Lire depuis le fichier /dev/tty équivaut à lire depuis le clavier.
Ecrire dans le fichier dev/lp équivaut à écrire vers l’imprimante. Lire ou
écrire dans le fichier /dev/hda équivaut à lire ou écrire sur le disque.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers
20

 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

Répertoires Fichiers Fichiers spéciaux Fichiers spéciaux


(fichiers système ordinaires caractère bloc
qui conservent (contiennent les (liés aux E/S série) (liés aux disques)
la structure du informations des
SF) utilisateurs)

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)

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Propriétés d’un système de fichiers
23

• Du point de vue utilisateur :


- Nommage des fichiers
- « Orthographe » des chemins relatifs et absolus (‘/’ ou ‘\’ pour
séparer les répertoires)
- Protection et droits d’accès aux fichiers
- Les opérations disponibles et autorisées sur les fichiers
- etc.
• Du point de vue implémentation :
- Organisation physique d’un fichier sur un disque
- Gestion des blocs et manipulation des blocs physiques attribués à un
fichier
- Gestion de l’espace libre du disque
- etc.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Liens symboliques et liens durs
24

• 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers
25

 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 … …

Windows NT Non 255 255

Windows 2000 Non 255 255

Support : Programmation système et environnement Unix // Par: Dr Maurice26


TCHOUPE T. (UDS)
Le Système de Fichiers
27

 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):

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers
29

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers
32

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers
34

 Gestion de l’espace libre


 Pour créer un fichier ou augmenter sa taille, le système a
besoin de connaître un bloc libre sur le disque.
 La liste des blocs libres est implémentée la plupart du temps
sous la forme d’un tableau binaire où chaque bloc est
représenté par un bit. Si le bit est à 0, le bloc est
disponible, si le bit est à 1, il est occupé. Cette méthode est
simple et efficace (la plupart des processeurs ont des
instructions permettant de calculer très rapidement la
position d’un bit à 0). Elle présente l’inconvénient de
nécessiter de l’espace en mémoire pour stocker la table.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
35

 Le fichier UNIX est une suite éventuellement vide


d’octets contenant une information quelconque. Aucune
supposition n’est faite par le système sur la structure de
ces octets (ASCII, binaire ou toute autre catégorie.).
L’interprétation des bits contenus dans les fichiers est de
l’entière responsabilité de l’utilisateur.
 Unix fait la différence dans les noms de fichiers entre
les majuscules et les minuscules (case-sensitive). En
théorie, tous les caractères du clavier sont autorisés dans
les noms de fichiers. En pratique, il vaut mieux s’abstenir
d’utiliser des caractères trop exotiques, risquant en
particulier d’être interprétés par certains programmes.
C.est notamment le cas de * ou ? et de . en début de nom.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers: LE SGF D’UNIX
36

 Hiérarchie des répertoires.


 Le système de fichiers est perçu par l’utilisateur comme une hiérarchie de
répertoires et de sous répertoires. A la racine de l’arbre se trouve le répertoire
de nom /. Il n’existe pas de notions de disque comme dans MSDOS ou VMS.
 Les différents disques logiques (partitions de disques physiques) du système ou
des systèmes constituent chacun un système de fichier avec une racine. Chacun
de ces système de fichiers est raccroché dans l’arbre au démarrage du système
ou explicitement par la commande mount.

Deux systèmes de fichiers séparés Après le montage


Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers: LE SGF D’UNIX
37

 Hiérarchie des répertoires.


 Un fichier peut être dénommé par son chemin absolu ou par son
chemin relatif au répertoire courant. Dans la plus grande généralité,
le chemin absolu est du type :
<nom de machine>.[<nom de domaine>]/<chemin absolu>/<nom
de fichier>
 On peut utiliser des extensions sur les noms de fichiers comme dans
MSDOS, mais elles n’ont aucune signification pour le système lui même.
Elles en ont éventuellement pour les bureaux de type graphique, qui
peuvent alors associer une icône particulière à une extension donnée. La
seule information qui indique quelque chose au système est le fait que le
fichier ait été marqué comme « exécutable » (voir plus loin la notion de
contrôle d'accès). C’est à cette seule condition que le système acceptera
de lancer son exécution, sans d’ailleurs vérifier si le fichier en question
est réellement exécutable.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
38

 Hiérarchie des répertoires.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
39

 Copie, déplacement, liens sur les fichiers.


 Voir les commandes ls (affichage de contenus de fichiers), cp
(copie de fichiers), mv (déplacement de fichiers), rm (suppression
de fichiers), mkdir (création de répertoires), cd (changement de
répertoire), rmdir (suppression de répertoire).
 Le système de fichiers peut contenir plusieurs entrées qui font
référence au même fichier physique réel. C’est la notion de lien
physique et de lien symbolique.
 ln crée des liens physiques entre fichiers.
 ln -s crée des liens symboliques entre fichiers. Il s’agit en quelque
sorte d’un raccourci pour désigner le fichier. Le système effectue
automatiquement le déréférencement, sauf pour quelques opérations
comme rm qui détruit le lien et non le fichier pointé par le lien.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
40

 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).

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
41

 Contrôles d'accès

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
42

 sticky bit, set uid, set gid :

 Exemple: voir ci-dessous


Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Le Système de Fichiers: LE SGF D’UNIX
43

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
46
 Contrôles d'accès
 Exemples:
$ ls -l ../c/bks
-rwx--x--x 1 jmr ens 9282 Nov 13 13:27 ../c/bks
$ chmod u+t ../c/bks
$ chmod u+s ../c/bks
$ ls -l ../c/bks
-rws--x--t 1 jmr ens 9282 Nov 13 13:27 ../c/bks
$ chmod g+s ../c/bks
$ ls -l ../c/bks
-rws--s--t 1 jmr ens 9282 Nov 13 13:27 ../c/bks
$ ls -l /tmp/toto
-rw-r--r-- 1 jmr ens 200 Jan 27 18:51 /tmp/toto
$ chmod g=w /tmp/toto
$ ls -l /tmp/toto
-rw--w-r-- 1 jmr ens 200 Jan 27 18:51 /tmp/toto

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
47

 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

 chgrp <groupe> <refFichier> … permet de changer le


groupe d’un fichier.
 $ ls -l exemples/toto
-rw-rw-r-- 1 root ens 84 Jan 27 19:09 exemples/toto
 chgrp sys exemples/toto
 $ ls -l exemples/toto
-rw-rw-r-- 1 root sys 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
48

 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).

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: LE SGF D’UNIX
49
 Hiérarchie d’un système de fichiers
 Le détail des répertoires systèmes varie d.une implémentation à une autre. Il existe malgré
tout des ressemblances.
 /bin : commandes de base
 /dev : périphériques
 /dev/fdx : lecteur de disquette
 /dev/hdx : partition de disque dur ide (hda, hdb, hdb, hdc)
 /dev/sdx : partition de disque dur scsi
 /dev/cdrom : comme le nom l’indique
 /dev/lpx : imprimante
 /dev/mem : mémoire .
 /etc : fichiers de configuration et d’installation
 /home : fichiers utilisateurs
 /lib : bibliothèques de programmes
 /sbin : commandes d’administration
 /usr : programmes et utilitaires mis à disposition des utilisateurs
 /opt : programmes du système local (voir aussi /usr/bin ou /usr/local/bin)

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques appels système relatifs aux fichiers
50

 On peut également inter-agir sur le SF par programme


à travers des appels systèmes.
Appel système Description
df = open(nom, mode,…) Ouverture en lecture, écriture, etc.
s = close(df) Fermeture d’un fichier ouvert
n = read(df, buffer, nb_octets) Lecture d’un nombre d’octets d’un fichier vers un buffer
n = write(df, buffer, nb_octets) Ecriture d’un nombre d’octets d’un buffer vers un fichier
pos = lseek(df, offset, org) Déplacement du pointeur de fichier
Obtention d’informations sur le fichier (périphérique, i-
node, nb de liens durs sur le fichier, propriétaire, groupe,
s = stat(nom, &buf) taille, date de création date du dernier accès, date de la
dernière modification)
s = fstat(df, &buf) Idem, à partir du descripteur de fichier
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Quelques appels système relatifs aux répertoires
51

On peut aussi interagir avec le SF par programme au moyen d'appels systèmes

Appel système Description


s = mkdir(chemin, mode) Création d’un nouveau répertoire.
s = rmdir(chemin) Suppression d’un répertoire
s = link(fichier, lien) Création d’un lien
s = unlink(chemin) Suppression d’un lien (et éventuellement du fichier)
s = chdir(chemin) Changement du répertoire courant
dir = opendir(chemin) Ouverture d’un répertoire en lecture
s = closedir(dir) Fermeture d’un répertoire
dirent = readdir(dir) Lecture d’une entrée du répertoire
rewinddir(dir) Retour au début du répertoire pour une nouvelle lecture

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Redirections

stdout stdout
0 1 stdin
0 1 fichier
stdin

Processus
Processus

2 stderr 2 stderr

Lorsqu’un processus démarre de façon standard, 3 fichiers spéciaux sont


ouverts automatiquement :
• Entrée standard (stdin) – descripteur 0, par défaut équivalent au clavier
• Sortie standard (stdout) – descripteur 1, par défaut équivalent à l’écran
• Sortie erreur standard (stderr) - descripteur 2, par défaut équivalent à
l’écran
Ces 3 entrées/sorties peuvent être redirigées afin que la lecture/écriture se
fasse à partir/vers d’autres fichiers.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Redirections - exemples
Commande shell Description
Trie les lignes tapées au clavier; écrit le résultat trié à
sort
l’écran
sort < f1 Trie les lignes du fichier f1; écrit le résultat trié à l’écran
Trie les lignes tapées au clavier; écrit le résultat trié dans le
sort > f2
fichier f2 (si f2 existait avant il est efface et recréé)
Trie les lignes tapées au clavier; attache le résultat trié à la
sort >> f2
fin du fichier f2 (si f2 n’existait pas avant il créé)
Trie les lignes tapées au clavier; écrit le résultat trié à
sort 2> f3 l’écran. Les messages d’erreur éventuels sont écrits dans le
fichier f3.
…………………………………………………………..
sort <f1 >f2 2>f3
…………………………………………………………..
…………………………………………………………..
sort < f1 2>> f3
…………………………………………………………..

(ls -l toto > f1) 2> f2 53


Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Vers les tubes - exemple

Problème : compter le nombre de mots uniques dans une liste .


sort –u <f1 >f2 #Trie l’entrée standard en laissant
#une occurrence unique de chaque ligne
wc –l <f2 #word count : affiche sur la sortie
#standard le nombre de lignes
#dans l’entrée standard
Fichier f1 Fichier f2
demain stdout
hier
stdin 0 1 demain
stdin 0 1
stdout
sort –u <f1

mardi dimanche

Processus exécutant
wc –l <f1
Processus exécutant

lundi hier
demain lundi
lundi mardi 5
>f2

dimanche

2 stderr 2 stderr

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Tubes

Un tube = un flot de données entre deux processus obtenu par la redirection


de la sortie standard d’un processus vers l’entrée standard d’un autre processus
sans création de fichier intermédiaire.
Meilleure solution pour le problème précédent :
sort –u <f1 | wc -l
Fichier f1
demain stdout
hier
stdin 0 1 0 1
mardi stdout stdin
sort –u <f1

Processus exécutant
wc –l <f1
Processus exécutant

lundi
demain
lundi 5
>f2

dimanche

2 stderr 2 stderr

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
56

 Les différents types de fichiers


 Fichiers ordinaires(-) : suite d’octets sans structure et sans marque de fin
de fichier. Seule le mémorisation de la longueur permet de détecter la
fin du fichier.
 Fichiers répertoires(d) : un fichier contenant des noms de fichiers.
 Liens symboliques(l) : contient seulement le chemin et le nom du fichier à
atteindre.
 Tubes nommés(p) : fichiers particuliers contenant des caractères, gérés
comme des tubes entre un processus producteur et un processus
consommateur.
 Fichiers spéciaux(c, p ou b) :
 permettent aux processus de « voir » les périphériques comme des fichiers.
Un programme n’a ainsi pas à se soucier de l’endroit où il écrit.
 Les fichiers spéciaux sont regroupés par convention dans le répertoire dev.
 Ils ne contiennent pas de données.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
57

 Structure d’un disque


 Chaque système de fichier UNIX implémente un ensemble
de concepts communs dérivés du système de fichier
d’origine. Les fichiers sont représentés par des « inodes »,
les répertoires sont des fichiers simples contenant des listes
d’entrées et les périphériques sont traités comme des fichiers
(il suffit d’émettre des demandes de lecture/écriture sur des
fichiers spéciaux).
 Un disque se décompose en un bloc de boot, et des volumes
(partitions). Chaque volume contenant un système de fichiers.
 Chaque système de fichiers se compose d’un superbloc,
d’une table des inodes, et des blocs de données où sont
stockés les fichiers.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
58

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
59

 Chacun de ces groupes est constitué de blocs logiques, contenant un


multiple de 512 octets (variable selon la version du système, les
décisions de formatage, .). La taille d’un bloc logique est fixe dans
un système de fichier. On peut par contre choisir une taille
différente de bloc selon le système de fichier et son utilisation
prévue.
 Les systèmes de fichiers sur les disques se répartissent dans des
blocs de tailles fixe correspondant à des unités d’entrée-sorties du
contrôleur. La lecture ou l’écriture d’un élément du fichier nécessite le
transfert intégral du bloc qui contient cet élément. Lors d’un transfert
de données d’un disque physique vers la mémoire, le temps du
transfert des données est composé du temps de positionnement de
la tête devant le bloc à lire, puis du temps de lecture du bloc et. Ce
dernier est négligeable devant le temps de positionnement. La
question de la taille des blocs est donc une recherche de compromis
entre la rapidité et l’espace perdu sur le disque.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
60

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
61

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
62

 Les inodes

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
63

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Le Système de Fichiers: MISE EN
OEUVRE DU S.G.F. UNIX
64

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


65

Expressions régulières et filtres

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Expressions régulières
Une expression régulière = un motif qui permet de décrire un ensemble de chaînes
de caractères.
Les expressions régulières sont massivement utilisées dans les systèmes
d’exploitation pour :
• La recherche de fichiers dans une arborescence (ayant les noms correspondant à
un motif)
• La recherche et la modification de motifs textuels dans des fichiers par des
utilitaires nommés filtres (grep, sed, awk, etc.)
• La définition de la syntaxe des commandes (man)
Exemples :
ls *.jpg #Lister tous les fichiers du répertoire
#courant ayant pour l’extension .jpg
grep ‘sys[0-9]’ f1 #Afficher toutes les lignes du fichier f1
#contenant la chaîne sys suivie d’un chiffre

Support : Programmation système et environnement Unix // Par: Dr Maurice


66 TCHOUPE T. (UDS)
Caractères spéciaux

Les caractères suivants sont spéciaux – ils servent d’opérateurs aux expression
régulières.

. ? * + { } , - [ ] ^ $ \ |

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Expressions régulières atomiques (1/2)

Les expressions régulières atomiques décrives des caractères isolés :

Expression Exemples de Séquences atomiques


régulière atomique Signification motifs correspondantes au
motif
Un caractère non spécial
quelconque
Se décrit lui-même a a

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> …

Suite de caractères entre Décrit un ensemble de


[ et ] caractères
[ab09] a, b, 0, 9

Deux de caractères entre Décrit tous les caractères


[ et ] séparés par un ‘-’ dont le code ascii est dans [a-d] a, b, c, d
(une « plage ») l’intervalle indiqué
Par: Dr Maurice Support : Programmation système et
68
TCHOUPE T. (UDS) environnement Unix //
Expressions régulières atomiques (2/2)

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) :

Expression Exemples Séquences


régulière Signification de motifs correspondantes
au motif
Une expression Décrit un caractère comme sur 2
régulière atomique transparents précédents
[a-z] a, b,…, z

Décrit toutes les concaténations de


Une concaténation
d’ER
séquences décrites par la première [a-z][0-9] a0, a1, .., b7, b9,…
et la deuxième ER
Deux ER reliées par …toutes les séquences décrites par
un ‘|’ la première ou la deuxième ER
ab|cd ab, cd

… le même ensemble de mots que


l’ER à l’intérieur des parenthèses,
Une ER entre ‘(‘et ‘)’
mais permet de marquer les
(ab)|(cd) ab, cd
frontières d’un motif

Support : Programmation système et environnement Unix // 70 TCHOUPE T. (UDS)


Par: Dr Maurice
Expressions régulières (« étendues ») (2/3)

Expression Exemples de Séquences


régulière Signification motifs correspondantes au
motif
… zéro ou une occurrence du
Une ER suivie de ‘?’
motif précédent
((ab)|(cd))? séq. vide, ab, cd

… zéro ou plusieurs a, ab, ac, abb, abc, acb,


Une ER suivie de ‘*’
occurrences du motif précédent
a(b|c)* acc, abbb,…
… une ou plusieurs
Une ER suivie de ‘+’
occurrences du motif précédent
(ab)+ ab, abab, ababab, …

Par: Dr Maurice Support : Programmation système et


71
TCHOUPE T. (UDS) environnement Unix //
Expressions régulières (« étendues ») (3/3)

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

… N occurrences ou plus du abab, ababab,


Une ER suivie de {N,}
motif précédent
(ab){2,} abababab,…
… Entre N et M occurrences
Une ER suivie de {N,M}
du motif précédent
(ab){1,3} ab, abab, ababab

…les mêmes séquences que


celles décrites par l’ER mais
Une ER suivie par ‘$’
seulement si elles apparaissent
ab$ ab en fin de ligne
en fin de ligne
…les mêmes séquences que
celles décrites par l’ER mais
Une ER précédée par ‘^’
seulement si elles apparaissent
^ab ab au début de ligne
au début de ligne
Par: Dr Maurice Support : Programmation système et
72
TCHOUPE T. (UDS) environnement Unix //
Expressions régulières « simples »
Dans les expressions régulières simples les meta-caractères suivants perdent
leur significations spéciales :

? + { } | ( )
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

Un filtre est un programme qui prend en entrée un fichier texte, et qui le


transforme selon certains règles avant de l’envoyer en sortie. Les règles sont
souvent exprimées sous forme d’expressions régulières.

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’

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE


74 T. (UDS)
75

Gestion de processus

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


LES PROCESSUS
76
 Un processus est un programme en cours d’exécution.
 Si un programme peut être caractérisé par la suite de ses instructions, un
processus va être caractérisé par cette même suite d’instruction,
auxquelles il convient de rajouter un ensemble de données qui vont
varier au cours du temps. Ainsi, à un instant t donné, il s’ajoute à ces
instructions exécutables la valeur des différents registres du processeur (qui
la plupart du temps va caractériser l’instruction suivante exécutable), la
valeur du compteur ordinal (qui détermina la position atteinte dans
l’exécution du programme), les valeurs des différentes variables dans la
mémoire.
 Un même programme peut être lancé plusieurs fois par le même
utilisateur ou par des utilisateurs différents.
 Le résultat de chacun de ces lancements, le temps d’exécution, le contenu
de la mémoire lors de l’exécution, parfois même la quantité de mémoire
occupée par les données seront pratiquement toujours différents. C'est
même ce qui fait fondamentalement la puissance de l’informatique, par
opposition aux automatismes. Il y aura bien un programme et plusieurs
processus.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Processus = programme en cours d’exécution
77
Environnement d’un processus

Espace d’adressage Registres Etat Divers caractéristiques


• Pointeurs sur segments de (élu,
PC • Process ID (PID)
code, de données et de pile prêt, • Group ID (GID)
FFFF bloqué)
pile SP • Parent process ID (PPID)
• Priorité
Drapeaux • Date de lancement
données . • Temps UC utilisé
.
. • Répertoire courant
code • Fichiers ouverts
0000
• …
Tous les processus sont recensés dans une table de processus, où une entrée
décrit un processus.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
LES PROCESSUS
78
 Certains processus n'appartiennent pas à un utilisateur en
particulier. Ils sont nécessaire au fonctionnement du système dans
son ensemble , ou bien à une partie du système. C'est le cas par
exemple des très nombreux processus tournant en arrière plan
sous Unix (démons), et permettant de gérer l'imprimante, le
réseau, la mémoire, l'écran, etc.. On parlera dans ce cas de
processus systèmes, par opposition aux processus utilisateurs,
appartenant à un utilisateur particulier.
 Dans un système Unix, la commande ps permet de visualiser les
processus en cours d'exécution. Sous Windows 9x, la séquence de
touches ctrl-alt-del permet de voir la liste des processus en cours.
Sous Windows NT, plusieurs outils permettent cette même
visualisation, sous différentes formes et avec plus ou moins de
détails : le gestionnaire de tâches, la liste des services, …
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
LES PROCESSUS
79

 Dans un système d’exploitation traditionnel, on


verra qu’un processus est caractérisé par un flux de
contrôle unique, et un espace d’adressage unique.
Sauf opération particulière (mémoire partagée ou
fichiers mappés en mémoire), plusieurs processus ne
partagent jamais le même espace mémoire.
 Ce cas de figure peut être un désavantage dans
certaines circonstances. C'est pour cette raison
qu'ont émergé ces dernières années les processus
légers (lightweight process) nommés communément
threads
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
LES PROCESSUS
80

 Les threads permettent différents flots d’exécution au sein d’un même


processus, avec une marge importante d.indépendance les uns par
rapport aux autres. Ils partagent, contrairement aux processus, un
même espace d’adressage, les fichiers ouverts et d’autres
ressources. Ils peuvent également interagir plus facilement les uns vis
à vis des autres. Enfin, et c.est souvent ce qui justifie grandement leur
existence, leurs création par le système d’exploitation est
généralement plus rapide que celle de processus, dans la mesure ou
il n’y a pas de copie de mémoire à réaliser. Les threads sont ainsi
bien adaptés à des processus client/serveur, le serveur étant alors
implémenté sous forme d’un thread particulier (dispatcher), chargé
de mettre en activité un pool de threads serveurs (workers).
 Les concepts liés à l’existence des threads sont relativement
similaires à ceux des processus, avec quelques complications
supplémentaires dues à la coexistence des threads à l'intérieur du
processus. Nous reviendrons plus tard sur le sujet.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Création de processus
81

Exemple : sous UNIX, l’interpréteur de commandes (shell) est un


processus qui :
• saisit une commande au clavier
• crée un processus fils en lui indiquant quel programme
exécuter pour réaliser la commande (sous Unix, fork est le
seul appel système de création de processus)
• Attend que le processus fils se termine (si le processus fils est
en avant plan) ou continue la saisie (si le processus fils est en
arrière plan)
La création d’un processus peut aussi se faire à partir d’un
programme utilisateur (on fera ceci par la suite et aussi en
TP…).
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Terminaison de processus
82

Un processus peut se terminer suite à l’un des 4 événements :


• Sortie normale, lorsque le processus a terminé sa tâche (sous Unix
par l’appel système exit)
• Sortie suite à une erreur (e.g. division par 0, inexistence d’un
fichier passé en paramètre)
• Tué par un autre processus (sous Unix par l’appel système kill)

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Hiérarchie de processus (sous UNIX)
83

Si le processus A crée le processus B, A est le parent de B, B est le fils de A. B peut


à son tour créer des processus. Un processus avec tous ses descendants forment un
groupe de processus représenté par un arbre de processus.
Exemple : void main() void main()
{int i; {int i;
fork(); fork();
i = i+1; i = i+1;
void main() fork(); fork();
{int i; i = i-1;} i = i-1;}
fork(); Processus B Processus D
i = i+1;
fork();
A
void main()
i = i-1;} {int i;
fork(); B C
i = i+1;
Processus A
fork();
i = i-1;}
Support : Programmation système Processus
et environnement
D
C Unix // Par: Dr Maurice TCHOUPE T. (UDS)
scheduling
time
Ordonnancement des processus sharing

84

Dans un système multitâche plusieurs processus sont en cours simultanément,


mais le processeur ne peut, à un moment donné, exécuter qu’une instruction
(d’un programme) à la fois. Le processeur travaille donc en temps partagé.
L’ordonnanceur (scheduler) est le module du SE qui s’occupe de sélectionner le
processus suivant à exécuter parmi ceux qui sont prêts.
PC (unique)
FFFF

Programme C Processus C

Programme B Processus B

0000 Programme A Processus A

temps
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Algorithmes d’ordonnancement (1/2)
85

1. Tourniquet (round robin) : chaque processus a un intervalle fixe de temps de


processeur (quantum). Le processeur est donné à un autre processus lorsque
• le temps prévu pour le processus en cours s’est écoulé
• le processus courant se bloque (e.g. en attendant une saisie au clavier)

quantum Mise en oeuvre par une file d’attente :


P1
File de processus prêts :
P6 P2 P1 P2 P3 P4 P5 P6

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

2. Ordonnancement avec priorité : chaque processus a sa priorité et on lance le


processus prêt dont la priorité est la plus élevée. La priorité du processus en
cours diminue au fur et mesure de son temps pris dans le processeur. Lorsque
cette priorité baisse en dessous de celle d’un autre processus en attente, le
processus courant cède sa place dans le processeur.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Algorithmes d’ordonnancement (2/2)
87

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)

2. Le plus court d’abord (pour minimiser le temps moyen d’exécution)

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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Etats d’un processus (cas d'UNIX)
89
 Plus précisément, dans le système UNIX, les différents états d'un processus
peuvent être caractérisés comme suit :
 Le processus est prêt en mémoire. Il ne s'exécute pas, mais il est
chargé en mémoire et est prêt à s'exécuter dès que le noyau l'élira
comme processus actif.
 Le processus s'exécute en « mode noyau », c'est à dire qu'il fait appel
à une fonction du noyau du système (read, write, fork, exec, .) .
 Le processus s'exécute en « mode utilisateur », c'est à dire qu'il réalise
des calculs d'une fonction de bibliothèque (+, -, strcpy, .) .
 Le processus est « préempté », c'est à dire que le noyau a effectué un
changement de contexte pour élire (« donner la main à ») un autre
processus.
 Le processus est « zombie ». Il a provoqué un appel à une instruction
de terminaison (exit), et n'aura donc plus besoin du CPU, mais son père
n'a pas encore pris connaissance de ses codes de retour et de ses
statistiques d'exécution. Cet état est typique des processus UNIX. Il est
normalement très transitoire. C.est un état terminal.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Etats d’un processus (cas d'UNIX)
90

 Le processus est endormi en mémoire. Il a provoqué une


instruction de mise en sommeil volontaire (sleep). Il n'a pas
besoin d'être élu par l'ordonnanceur.
 Il existe ensuite un certain nombre d'états qui sont liés à la
gestion de la mémoire principale et de la mémoire
secondaire . Il existe un processus du noyau ( le swapper ),
qui se charge de « faire de la place » en mémoire vive
(mémoire principale), en utilisant le disque comme zone
de stockage temporaire (mémoire secondaire).
 Le processus est prêt à s'exécuter, mais le swapper l'a
transféré sur disque. Il devra de nouveau être ramené
en mémoire avant de pouvoir continuer son exécution.
 Idem si il était préalablement endormi ou préempté .

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Etats d’un processus (cas d'UNIX)
91

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


92

Communication entre processus

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Communication inter-processus
93

Souvent différents processus ne sont pas totalement indépendants : ils doivent


échanger des informations.
Exemple : processus A est dédié à la gestion d’une imprimante, processus B
désire imprimer un document. B doit communiquer à A le nom et l’emplacement
du fichier qu’il veut imprimer.
Il existe deux méthodes classiques de communication inter-processus : des
variables partagées (shared variables) et l’échange de messages (message
passing).
Exemple de variables partagées : plusieurs processus veulent imprimer leurs
résultats sur une imprimante commune. Les noms des fichiers à imprimer sont
placés dans un tableau spécial fonctionnant comme une file : les variables
partagées début et fin indiquent le premier et le dernier fichier dans la file.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Variables partagées
94
Supposons que processus B veut imprimer un fichier (nommé F_b). Le nom du fichier
est placé dans un tableau spécial fonctionnant comme une file : les variables
partagées tête et queue indiquent le premier fichier dans la file et l’endroit
d’insertion d’un nouveau fichier.
5 6 7 8 9

après I1
Fich.c TP17.c CV.doc Test.ps

Processus B : tête queue


<qb  queue> //I1
<charger fichier 5 6 7 8 9

après I2
F_b dans [qb]> //I2 Fich.c TP17.c CV.doc Test.ps F_b

<queue qb+1> //I3


tête queue

5 6 7 8 9

après I3
Fich.c TP17.c CV.doc Test.ps F_b

Support : Programmation système et environnement Unix tête // queue


Par: Dr Maurice TCHOUPE T. (UDS)
Conflits d’accès aux variables partagées (1/2)
95
Exemple : Deux processus B et C veulent placer au même moment leurs fichiers (F_b
et F_c) dans la file d’impression. L’ordonnancement de ces processus est tel que
leurs instructions s’exécutent alternativement : I1b, I1c, I2b, I2c, I3b, I3c.
5 6 7 8 9
Processus B : qb 9 Fich.c TP17.c CV.doc Test.ps
après
I1b
<qb  queue>
tête queue
//I1b
<charger fichier qb 9 5 6 7 8 9
Fich.c TP17.c CV.doc Test.ps après
F_b dans [queue]> //I2b I1c
qc 9
<queue qb+1> //I3b tête queue

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

• Threads = exécutions multiples (pseudo-) parallèles


présentes dans le même processus.
• Les threads d’un processus partagent
l’environnement de ce processus (espace
d’adressage, priorité, PID, PPID, GID etc.) sauf : le
PC, les valeurs des registres, la pile, l’état.
• Chaque processus a au moins un thread, mais peut
en avoir plusieurs.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Threads (processus légers)
99

Exemple : un éditeur de textes peut assurer diverses fonctionnalités


indépendantes, mais concernant le même document (e.g. saisie des
caractères au clavier, formatage du texte à l’écran, enregistrement
automatique à des intervalles réguliers). L’éditeur correspond à un
processus, et ses fonctionnalités à différents threads de ce processus :

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

Gestion de processus sous UNIX/Linux

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Démons

• Unix/Linux est multitâche.


• A côté des processus multiples appartenant à chaque utilisateur, tournent en
tâche de fond des dizaines de processus démons lancés au démarrage du
système.
• Exemple : démon cron se déclanche automatiquement toutes les minutes
pour voir s’il y a un travail à accomplir, si oui il lance les programmes
demandé, puis se rendort. On peut ainsi planifier des actions à l’avance
(sonnerie de rappel d’un RDV, contrôle anti-virus dans la nuit en l’absences de
l’utilisateur, chargement du courrier électronique, etc.).

Par: Dr Maurice Support : Programmation système et


101
TCHOUPE T. (UDS) environnement Unix //
Création d’un processus - fork

• 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.

Par: Dr Maurice Support : Programmation système et


102
TCHOUPE T. (UDS) environnement Unix //
Exemple d’appel de fork

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*/

Par: Dr Maurice Support : Programmation système et


103
TCHOUPE T. (UDS) environnement Unix //
Sécurité des processus sous Linux -
mode utilisateur et mode noyau
• Les processus du système ont besoin d’accéder à toutes les ressources du
systèmes (car leur rôle est de gérer ces ressources). On dit qu’ils fonctionnent
en mode noyau.
• Il est dangereux de donner l’accès direct aux ressources du système à un
utilisateur (même averti). Donc, chaque processus d’utilisateur a son propre
environnement (pile, donnée, etc.) différents des autres processus. Il n’a pas
accès à l’environnement des autres processus, ni à celui des processus noyau.
Il fonctionne en mode utilisateur. S’il fait des « bêtises » cela n’affecte que
son environnement, et pas le système ni les environnement des autres.
• Mais un processus utilisateur a parfois besoin d’accéder aux ressources. Il n’y
a pas le droit directement, mais il peut le faire à travers les appels systèmes
(seules façons autorisées par le système – même principe que l’encapsulation des objets en
Java…). En exécutant un appel système le processus bascule en mode noyau,
avec tous ces privilèges, mais l’utilisateur n’a aucune influence sur le code
exécuté à ce moment-là.
Par: Dr Maurice Support : Programmation système et
104
TCHOUPE T. (UDS) environnement Unix //
Quelques appels système relatifs aux processus
105

Appel système Description


pid = fork() Crée un processus fils identique au père..
Permet au processus père d’attendre la terminaison
pid =wait()
d’un fils.
Permet au processus père d’attendre la terminaison
pid = waitpid(pid, status, options)
du fils précis (ayant le pid précisé en paramètre).
Provoque l’exécution d’un autre programme par le
s = execve(nom, params, env) processus courant.
exit(status) Termine le processus courant.
pid = getpid() Retourne le PID du processus courant.
ppid = getppid() Retourne le PID du processus parent.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques programmes sur les processus
106

 L'exemple suivant illustre la création d'un nouveau processus


 $ cat creerprocessus.c
#include <stdio.h>
main(){ Exercice:
int n; • Dire comment
if ((n=fork())==-1){ compiler et
fprintf(stderr, "le fork est un echec\n"); exécuter le
exit(1);} programme ci-
else if (n==0) {/* on est dans le processus fils*/ contre.
printf("dans le processus fils, valeur de fork = %d\n", n); • Donner la
printf("identification du processus fils: %d\n", getpid());} sortie écran de
else { /*on est dans le processus père*/ son exécution
int i ;
printf("dans le processus pere, valeur de fork = %d\n", n);
printf("identification du processus pere: %d\n", getpid());
printf("fin du processus père");}
}
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Quelques programmes sur les processus
107

 Dans l'exemple suivant, le processus père meurt avant que le


processus fils ne s'exécute (et exécute en particulier l'appel
à getppid).
 $ cat nonsynchro.c
#include <stdio.h>
main(){
int n;
if (fork()==0){/*on est dans le processus fils*/
sleep(10);
printf("identification du processus fils: %d\n", getpid());
printf("mon pere est %d\n", getppid());}
else { /*on est dans le processus père*/
int i ;
printf("identification du processus pere: %d\n", getpid());
printf("fin du processus père");}
} : Programmation système et environnement Unix
Support // Par: Dr Maurice TCHOUPE T. (UDS)
Quelques programmes sur les processus
108

 Communication par tubes (pipes)


 Dans cet exemple, un processus (le père) filtre pour un
autre (en l'occurrence un processus fils obtenu par un
fork) parmi les lettres qu'il lit les lettres minuscules.
 Les lettres ainsi filtrées sont transmises par
l'intermédiaire d'un tube crée naturellement avant la
réalisation du fork afin que le processus fils y ait accès
(du fait de l'héritage des descripteurs).
 Le récepteur (processus fils) quand à lui les place dans
un tableau et imprime l'ensemble des caractères qu'il a
reçu avant de se terminer.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques programmes sur les processus
109
#include <stdio.h> if (n) {/*processus père*/ else{ /*processus fils*/
#define NMAX 1000 /*le père ne lira jamais char t[NMAX];
main(){ dans le tube*/ int i = 0;
int n, p[2]; close (p[0]); /*le fils n'ecrira pas dans le
char c; while((c=getchar())!=EOF) tube*/
if (pipe(p)){ /*ouverture du tube*/ if(c>='a' && c <='z') close(p[1]);
fprintf(stderr, "erreur:tube non /*ecrire un caractère dans le /*fermeture indispensable pour
tube*/ atteindre la fin du tube*/
ouvert\n");
write(p[1], &c, 1); /*lecture d'un caractere dans le
exit(1);
/*fermeture du tube en ecriture*/ tube*/
}
close(p[1]; while(read(p[0], &c, 1)
/*creation d'un processus fils*/
/*attente de la terminaison du if (i < NMAX)
if ((n=fork())==-1){
processus fils*/ t[i++]=c;
fprintf(stderr, "echec de la
wait(0); t[(i==NMAX)?NMAX-1:i]=0;
fourche\n");
} printf("t=%s\n", t);
exit(2);
} Support : Programmation système et environnement Unix // Par: Dr} Maurice TCHOUPE T. (UDS)
} /* fin de main*/
Quelques programmes sur les processus
110

 Communication par tubes (pipes): redirection de


l'entrée et de la sortie standard
 La redirection fait largement appel aux primitives de
bas niveau (dup et close).
 Cet exemple, illustre complètement le phénomène de
tube et de redirection des E/S standards sur un tube tel
que l'on peut le rencontrer dans les langages de
commandes
 Le programme qui suit correspond à la commande shell
who|wc .
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Quelques programmes sur les processus
111
#include <stdio.h> else else{ processus correspondant a
main(){ if (n==0){ /*processus wc; l'entree standard va etre
correspondant a who; la sortie redirigee sur la sortie du
int n, p[2];
standard va etre redirige sur tube en faisant de 0 et p[0]
/*creation du tube avant la des synonymes; l'appel
l'entree du tube en faisant de
fourche*/ close(p[1]) est ici essentiel
1 et de p[1] des synonymes*/
if (pipe(p)){ /*ouverture du tube*/ pour que la fin de fichier soit
close(1); atteinte en lecture sur le
fprintf(stderr, "pipe:echec\n");
dup(p[1]); tube*/
exit(1);
close(p[1]); /*facultatif*/ close(0);
}
close(p[0]); dup(p[0]);
/*creation d'un processus fils*/
/*recouvrement du processus par close(p[0]);
if ((n=fork())==-1){ le texte de la commande close(p[1]);
fprintf(stderr, "fork:echec\n"); who*/
/*recouvrement du processus
exit(2); execlp("who, "who, 0); par le texte correspondant a
} } wc */
execlp("wc", "wc", 0);
Support : Programmation système et environnement Unix // Par: Dr} Maurice TCHOUPE T. (UDS)
} /* fin de main*/
Quelques programmes sur les processus
112

 Communication par signaux


 Un autre mécanisme fondamental de communication inter-
processus est constitué par les signaux
 C'est par ce mécanisme que le système communique avec les
processus des utilisateurs en cas d'erreur (violation mémoire,
erreur dans une E/S, ou à la demande de l'utilisateur lui-même
(caractère d'interruption)
 On dispose d'un certains nombre de primitives permettant
l'émission de signaux asynchrones vers un processus donné et
l'indication de procédure à exécuter à la réception d'un signal
donné (ignorer un signal, provoquer une interruption ou un
déroutement sur une fonction spécifiée par l'utilisateur)
 Les signaux sont identifiés sous le système par un nombre entier
 De manière générale, le fichier de référence /usr/include/signal.h
contient la liste des signaux accessibles sur un système donné.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques programmes sur les processus
113

 Communication par signaux


 Emission d'un signal: tout processus à la possibilité
d'émettre à destination d'un autre un signal à la condition
que ses numéros de propriétaires lui en donnent le droit vis-
à-vis de ceux du processus récepteur. int kill (int pid, int sig);
 Réception d'un signal: la réception d'un signal par un
processus entraine par défaut la terminaison de ce dernier.
 Il est possible de modifier le comportement d'un processus à
l'arrivée d'un signal donné c'est ce qui se passe pour un certains
nombre de processus assez standard: un processus Shell par
exemple ignore le signal SIGQUIT (n°3: <CTRL \>) et à la
réception du signal SIGINT (N°2: <CTRL c>) affiche le promptet
n'est pas interrompu.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques programmes sur les processus
114

 Communication par signaux: Réception d'un signal:


 le programmeur a la possibilité de définir le comportement des
processus associés aux programmes qu'il développe, à la
réception des signaux (excepté pour le signal SIGKILL (N°9) qui
ne peut qu'entrainer la terminaison des processus qui le reçoivent.
 De façon générale signal(int sig, int(*fonc)() fonc) pemet de
définir le comportement d'un processus à la réception d'un signal.
On a trois possibilités:
 adopter un comportement par défaut: SIG_DFL, ou ignorer le signal:
SIG_IGN,; ces fonctions sont macro-définies dans le fichier
/usr/include.signal.h, et permettent de spécifier respectivement un
comportement standard (interruption) ou l'ignorance pure et simple du
signal.
 Spécifier une adresse d'une fonction choisie et définie l'utilisateur qui
sera alors exécutée à la réception du signal sig.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques programmes sur les processus
115

 Communication par signaux: Réception d'un signal:


 Spécifier une adresse d'une fonction choisie et définie
l'utilisateur qui sera alors exécutée à la réception du signal
sig. Précisons de plus que:
 Le numéro du signal reçu est fourni comme argument à la fonction
de déroutement ainsi appelée;
 Après exécution de cette fonction, le traitement du processus
reprend au point où il a été interrompu
 Après exécution de cette fonction, la valeur par défaut du
comportement est réadoptée pour le signal sauf mention contraire
pour le signal indiqué dans le fichier /usr/include/signal.h

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques programmes sur les processus
116

 Communication par signaux: Exemples (TP)


 Ignorance des interruptions clavier
 Le programme suivant ignore, par une suite de deux appels à la
primitive signal, les signaux SIGQUIT, et SIGINT puis entre dans une
boucle infinie;
 N'étant plus interruptible depuis la console, il doit l'être par un appel
à la commande Shell kill (kill -9 <numéro du processus>) depuis un
autre terminal (=> intérêt et rôle du signal 9 comme arme absolue).

#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

 Communication par signaux: Exemples (faire aussi en TP)


 Captage et déroutement
 Dans l'exemple suivant le processus exécute, à la réception des signaux
SIGINT/SIGQUIT, la fonction supp qui supprime un fichier temporaire
que le processus a créé auparavant (on notera au passage que la
référence de ce fichier dans le catalogue /tmp a été construite en
utilisant le numéro du processus) et,
 A la réception des signaux SIGUSR1 et SIGUSR2 (qui ne peuvent être
émis que depuis un autre processus), la fonction message.
 On notera que les deux fonctions supp et message ont un paramètre
qui, à la réception du signal entrainant leur appel, est initialisé à la
valeur du signal reçu, ce qui permet de savoir quel signal a été reçu et
donc de distinguer deux types d'action après réalisation du
déroutement (ici reprise pour SIGINT et terminaison pour SIGQUIT).
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Quelques programmes sur les processus
118
#include <signal.h> message(int n){ supp(int n){
char nom[30]; printf("signal SIGUSR1 %d unlink(nom);
main(){ bien recu\n", n); printf("n=%d\n", n);
int message(), supp(), n; } if (n==SIGQUIT){
signal(SIGINT, supp); printf("SIGQUIT recu\n");
signal(SIGQUIT, supp); exit(1);
signal(SIGUSR1, message); }
signal(SIGUSR2, message); else printf("SIGINT recu\n");
sprintf(nom, "/tmp/pp%s", }
getpid());
n=creat(nom, 0666);
}

• 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

 Communication par socket


 TPE

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


121

Le SHELL et la programmation en SHELL:


LE LANGAGE DE COMMANDE

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell
122

 Le nom de shell désigne l’interpréteur de commandes du système


UNIX.
 Le shell est à la fois un langage de programmation et un interpréteur
de commande.
 Le shell, lancé automatiquement dès le login interactif sur le système
Unix, réalise l’interface (en mode texte) entre l’utilisateur et le système
UNIX. Les programmes shell sont donc interprétés par celui-ci.
 Comme le shell entoure virtuellement l’ensemble des commandes, les
demandes faites par le programme se traduisent souvent par un
appel à une commande et on dit qu’il interprète un langage de
commande.
 Par la suite, on confondra par abus de langage, les termes «
interpréteur de langage de commande » et « langage de commande
».

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell
123

 Les commandes exécutées par le shell peuvent


provenir soit:
 du terminal (mode interactif),
 soit d’un fichier (mode batch). On peut en effet créer
des fichiers de commandes ce qui permet en quelque
sorte aux utilisateurs de fabriquer leurs propres
commandes. Ces commandes possèdent les mêmes
prérogatives que les commandes définies dans les
répertoires /bin et /usr/bin. De cette manière, il est
possible à un utilisateur de se façonner un
environnement sur mesure.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell
124

 Les interpréteurs de commandes sous UNIX


 Sous UNIX, l’interpréteur de commande n’est pas unique :
l’utilisateur, à sa convenance, peut choisir parmi plusieurs :
 (Bourne-shell ou sh : en standard, le plus ancien historiquement,
 Korn-shell (ksh : conçu comme une extension du Bourne-shell),
 C-shell (csh : dont la syntaxe est proche de celle du langage C),
 Bourne Again Shell (bash : le plus répandu sous Linux),
 ...

 Les programmes conçus pour sh peuvent, à quelques détails


près, être interprétés par les autres shells.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell
125

 Comment lancer l’exécution d’un programme schell


 Un programme shell (batch) est contenu dans un fichier.
 Pour le lancer, on peut utiliser trois méthodes :
 rendre le fichier exécutable par chmod +x fich. Puis il ne
reste plus qu’à taper fich [paramètres] chaque fois qu’on
veut le lancer. Le shell constatera que ce fichier contient des
commandes et les interprétera.
 sh [-options] fich [paramètres]
Cette commande permet de forcer l'exécution du fichier ded
commandes en créant un nouveau processus shell (prenant ses
données dans le fichier de commandes)

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell
126

 Comment lancer l’exécution d’un programme schell


 Ces deux dernières manières de procéder ont pour
inconvénient de créer un nouveau processus descendant du
processus SHELL courant d’où la commande est lancée et qui
dans certain cas peut être gênant.
 généralement, on aimerait que le fichier de commande soit
interprété dans le même processus que celui du shell pour
cela, on redirige momentanément l’entrée standard du shell
interactif courant au moyen de la commande
. <reference fichier commande>
 ainsi la commande $ . com1 exécute le script com1.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: lexique
127

 Le shell interprète des instructions séparées par des séparateurs. Les


instructions étant de sortes très différentes, nous utiliserons le
vocabulaire suivant :
 une commande est une instruction analogue à un appel de sous-
programme dont le code est exécutable par la machine.
 Par exemple cp et rm, sont des commandes.
 une commande interne est une instruction analogue à un appel de sous-
programme interne au shell. Son action est réalisée par le shell lui-
même.
 Par exemple exit est une commande interne au shell.
 une instruction est une commande interne qui est une structure de
contrôle if, while, for, sont des instructions du shell.
 une phrase, ou une ligne de commande, est une composition
syntaxiquement correcte de commandes, commandes internes et
instructions que sait interpréter le shell.
 Les séparateurs de phrases sont le retour chariot (rc) et le ;

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: lexique
128

 Dans une phrase, les séparateurs sont le blanc et la


tabulation, leur nombre étant quelconque.
 Les mots du langage sont constitués avec les caractères
lettres, chiffres et souligné. Ils commencent par une
lettre ou un souligné. On peut utiliser des caractères
spéciaux à condition de les invalider.
 Les mots désignent les variables, les symboles du
langage et les noms des fichiers. On pourra placer des
commentaires à condition de les faire précéder d’un
dièse (#) et de les terminer par un (rc).

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: caractères génériques
129

 Les caractères génériques portent aussi le nom de caractères jokers.


Ils servent à remplacer un caractère quelconque ou n’importe quelle
chaîne, même vide (comme les jokers remplacent n’importe quelle
carte).
 Lorsque le shell rencontre un mot comportant un caractère joker, il
tente de remplacer ce caractère par toutes les solutions possibles.
On obtient ainsi plusieurs combinaisons contenant le mot. Ces
caractères sont le point d’interrogation, l’étoile et les crochets.
 ? remplace un caractère quelconque sauf le retour cariot (rc).
 * remplace n’importe quelle chaîne de caractères, même vide, ne
comportant pas de (rc).
 [ ] remplace un caractère:
 parmi ceux énumérés entre les crochets ou
 un caractère parmi ceux qui ne sont pas énumérés si la liste commence par un
point d’exclamation.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: caractères génériques
130
 Lorsque le shell interprète les caractères génériques, il ne les remplace pas s’il ne
trouve aucun nom de fichier à mettre en correspondance. Par exemple:
 rm * supprime tous les fichiers du répertoire courant ainsi que tous les sous-répertoires
vides.
 ls -l t*.c liste tous les fichiers du répertoire courant commençant par t et se terminant par
.c.
 ls -l *.? liste tous les fichiers du répertoire courant se terminant par . suivi d’un seul
caractère.
 cp [a-e]*.* .. copie tous les fichiers du répertoire courant commençant par une des cinq
premières lettres de l’alphabet, et contenant au moins un point dans leur nom, même en
dernière position. La copie se fait dans le répertoire père.
 La commande ls -l ??? vous donnera les contenus de tous les répertoires écrits avec
seulement 3 lettres.
 La commande ls -l ??e* liste le contenu des répertoires commençant par 2 lettres
quelconques suivies d’un e et de n’importe quoi y compris un blanc.
 La commande ls -l [A-Z,a-e]* liste le contenu des répertoires commençant par une lettre
majuscule ou par une minuscule comprise entre a et e. On aurait aussi pu écrire : ls -l [A-
e]* .

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: Caractères spéciaux
131

 Le caractère de continuation \ placé en fin de ligne


indique que la phrase en cours n’est pas terminée et
qu’elle se poursuit sur la ligne suivante. Le (rc) est
ainsi transformé en espace.
 Les caractères spéciaux ont une signification dans le
langage à moins qu’ils ne soient invalidés.
 Un caractère spécial devient un caractère normal
s’il est précédé du caractère \ ou s’il est situé dans
un parenthésage particulier.
 Les caractères spéciaux sont: & | < > $ () ’ " ‘ {} \

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell:Variables et paramètres
132

 Les variables sont désignées par des mots : elles ne


se déclarent pas.
 Il n’existe aucune notion de type.
 Par convention, les variables sont écrites en lettres
majuscules.
 Les paramètres désignent l’ensemble des chaînes de
caractères que l’on écrit à la suite du nom d’un
fichier shell lors de son exécution.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: Variables Utilisateurs
133

 L’initialisation d’une variable se fait par une affectation,


réalisée par le signe = (Pas d’espace de chaque côté de l’
= ).
 L’utilisation le la variable se fait avec le signe $.
 La valeur affectée à la variable peut être une valeur
numérique, une chaîne, le résultat d’une commande, une liste
de commandes parenthèsées.
$ HOME=/home/IUP2/etudiant #$==Invite de commande
$ echo $HOME
/home/UP2/etudiant
$
 Si la variable n’a pas été initialisée ou si elle comporte une
erreur d’écriture, la commande renvoie une chaîne vide. Si
l’on oublie le $, echo HOME renvoie HOME

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell
134

 Traitement des quotes


 Les chaînes de caractères doivent être encadrées par des quotes (.).
$ TEMPS=’Il fait beau’
$ echo $TEMPS
Il fait beau
$
 Traitement des accents graves
 Toute commande entre accents graves sera exécutée et le résultat
affecté à la variable.
$ EN_LIGNE=`who | cut –f 1 –d " "`
$ echo $EN_LIGNE
root
chiesa
lerest
$

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell
135

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: Variables prédéfinies
136

 Il existe des variables prédéfinies. Parmi celles-ci :


 # nombre de paramètres effectifs d’une commande
 ? code de retour d’une commande
 $ numéro du processus shell en cours
 ! numéro du dernier processus lancé en arrière-plan
 HOME nom du répertoire personnel
 PATH règle de recherche des commandes
 PS1 invite primaire du shell (par défaut $)
 PS2 invite secondaire du shell (par défaut >)

 On peut détruire une variable par la commande interne


unset, sauf les variables PATH, PS1 et PS2.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: Expansion des variables
137

 La substitution de valeur d’une variable ou d’un


paramètre permet d’évaluer conditionnellement la
valeur de la variable ou du paramètre. Ce mécanisme
sert à donner des "valeurs par défaut" à des variables
dont on ne sait pas si elles sont initialisées. Ainsi :
 ${VAR:-mot} délivre $VAR si la variable VAR est initialisée,
sinon initialise avec mot.
 ${VAR:=mot} assigne mot à VAR si la variable n’est pas
initialisée, puis évalue $VAR.
 ${VAR:?mot} délivre $VAR si la variable est initialisée, sinon
affiche le nom de la variable suivi de :, puis mot, et termine
le processus shell en cours.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: Expansion des variables
138
 Exemples
 1) ESSAI=${VAR:-mot} VAR n’étant pas initialisée, ESSAI est initialisé par mot
(équivalent à ESSAI=mot) ($VAR n’existe pas).
 VAR=init
 ESSAI=${VAR:-mot} VAR étant initialisée par init, ESSAI est initialisé par $VAR
(équivalent à ESSAI=$VAR).
 2) ESSAI=${VAR:=mot} VAR n’étant pas initialisée, VAR est initialisée par mot et
ESSAI devient équivalent à $VAR (équivalent à VAR=mot, ESSAI=$VAR, donc
ESSAI=mot)
 VAR=init
 ESSAI=${VAR:=mot} VAR étant initialisée par init, ESSAI devient équivalent à
$VAR (équivalent à ESSAI=$VAR)
 3) ESSAI=${VAR:?mot} VAR n’étant pas initialisée, affiche VAR: et mot puis
arrête le processus shell en cours.
 VAR=init
 ESSAI=${VAR:?mot} VAR étant initialisée par init, ESSAI devient équivalent à
$VAR (équivalent à ESSAI=$VAR) et le processus shell se continue.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: Portée et environnement
139

 La portée d’une variable est le processus qui l’a créée.


 Pour être visible dans les autres processus shell qui
seront créés par la suite, une variable doit être
exportée par la commande interne export : elle est
alors placée dans l’environnement du processus,
environnement dont hériteront ses fils.
 On lance export PATH pour exporter les chemins de
recherche de nos commandes (réalisé dans .profile).
 La liste des variables exportées dans l’environnement
est obtenue par la commande env.
 La liste de toutes les variables est obtenue par la
commande set.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: Portée et environnement
140

 Il est possible (en bash) de créer des variables


locales aux fonctions qui les utilisent. Par exemple :
#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: expressions, lecture et
141
affichage
 Le calcul d’expression sur des variables est
supporté par le shell sous certaines contraintes. $ A=3
$ B=2
 Tout d’abord, les opérateurs arithmétiques sont en $ Echo 1+3
nombre réduit : +-*/ et % (le reste). $ 1+3
 Ensuite, les calculs sont réalisés en nombre entiers $ echo $[1+3]
seulement. $4
 Enfin, il faut utiliser le [ ] pour réaliser l’évaluation. $ echo $[A+B]
Par exemple : $5
$ echo $[A/B]
$1
$ echo $[A/B]|bc –l
$ 1.5
La dernière ligne montre comment utiliser la commande calculateur bc pour se sortir de
l’impasse des nombres entiers.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: expressions, lecture et
142
affichage
 Les comparaisons arithmétiques :
 lt (<), gt (>), le (<=), ge (>=), eq (==), ne ( !=).
 Les comparaisons de chaînes sont facilement compréhensibles,
simplement il faut veiller à ne pas confondre avec des comparaisons
arithmétiques :
 s1=s2 , s1>s2, s1<s2, -n s1 (« s1 nest pas vide »), -z s1 (« s1 est vide »).
 Les comparaisons sur les fichiers :
 -r f (« f existe et a le droit de lecture r »),
 -w f (« f existe et a le droit w »),
 -x f (« f existe et a le droit x »),
 -f f (« f existe et est un fichier ordinaire »),
 -d r (« le répertoire r existe »),
 -u f (« f existe et a le bit set UID »),
 -s f (« f existe et n’est pas de longueur nulle »).
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Scripts Shell: expressions, lecture et
143
affichage
 Les lectures et les écritures sont réalisées par des commandes
internes du shell.
 La commande interne read permet dinitialiser des variables en mode
conversationnel et admet comme paramètre une ou plusieurs variables
séparées par un séparateur de mots.
 Elle initialise la première avec la première chaîne tapée, le séparateur au
clavier étant aussi le blanc (ou le TAB).
 Elle initialise la deuxième avec la deuxième chaîne, ... et elle initialise la
dernière avec toutes les chaînes de fin de ligne.
#!/bin/bash
echo Please, enter your firstname and lastname
read FN LN
echo "Hi! $LN, $FN !"
 La commande echo permet dafficher la valeur dune variable et est
souvent une commande interne. Nous en avons déjà vu de nombreux
usages.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: boucles et conditionnelles
144

 Les mots-clés sont :


 if then else fi case esac for while
until do done select
NUM=0
 Boucle for
for PARAM in $*
for indice in liste
do
do
NUM=`expr $NUM + 1`
liste_de_commandes echo "paramètre $NUM = $PARAM"
done done
 La liste_de_commandes est for USER in `cat liste`
exécutée pour chaque valeur de do
l’indice (une variable non elm $USER –s " fichier message " < message
déclarée) prise dans la suite de
mots indiquée dans liste après le done
in .

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: boucles et conditionnelles
145

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: boucles et conditionnelles
146

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: boucles et conditionnelles
147

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: boucles et conditionnelles
148
 Sélection if
 On peut imbriquer les structures if comme dans le cas suivant :
if...
then...
else if...
then...
else...
fi
fi
 On peut aussi écrire else if : elif (dans ce cas, un seul fi terminal)
 La structure if suivante :
if commande_1
then
commande_2
fi
 peut s’écrire commande_1 && commande_2

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: boucles et conditionnelles
149

 Sélection if: Exemple :


 Indiquer si les fichiers d’un répertoire sont des fichiers (ordinaires ou spéciaux) ou
des sous-répertoires.
for FICH in *
do
if [ -d $FICH ] # $FICH est-il un répertoire ?
then
echo "répertoire : $FICH"
else
echo "fichier : $FICH"
fi
done

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: boucles et conditionnelles
150
 Sélection case
case expression in
cas_1)
liste_de_commandes_1 ;;
cas_2)
liste_de_commandes_2 ;;
. ..
cas_n)
liste_de_commandes_n ;;
esac
 L’interpréteur de commandes cherche une équivalence entre la chaîne expression
et un des cas_i en suivant l’ordre de leur définition. Si une équivalence est trouvée
alors la liste_de_commandes associée est exécutée et la structure est terminée.
 Comme le caractère * représente toute chaîne de caractères, on l’utilise comme
cas par défaut. Si aucun cas ne convient, la structure case ne fait rien.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: boucles et conditionnelles
151

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
152

 Les commandes correspondent aux instructions du


langage de programmation.
 Une commande simple est une liste de mots séparés par
des espaces.
 Le premier est le nom de la commande,
 les autres sont les options et les paramètres.

 Une commande délivre en retour une valeur appelée


code de retour.
 Un code de retour nul indique une exécution sans erreur.
 Les valeurs positives et négatives ont des significations
propres à chaque commande.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
153

 Les commandes peuvent être exécutées de différentes


manières :
 exécution séquentielle : commandes séparées par un ;
 exécution asynchrone : commande terminée par un & (même
priorité que ;)
 exécution conditionnée :
 commandes séparées par && : exécution de la partie droite
conditionnée par un code de retour nul de ce qui précède
(priorité supérieure à &)
 commandes séparées par || : exécution de la suite conditionnée
par un code de retour non nul de ce qui précède (priorité
identique à &&)
 On peut aussi les trouver sous forme de pipe | :
 la sortie standard du processus situé à gauche est connectée par un
tube à l’entrée standard du processus situé à droite.
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Scripts Shell: les commandes
154

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
155
 Commandes internes
 . fichier exécuter les commandes du fichier sans créer un nouveau processus
 : instruction vide du shell.
 set list_args fournir les valeurs des paramètres effectifs correspondant aux
paramètres formels 1, 2, ... Permet ainsi de paramétrer les sous-programmes réalisés
par eval : il suffit pour cela que les commandes contenues dans la variable $VAR
soient paramétrées en faisant référence à $1, $2 ...
 eval $VAR le contenu de la variable $VAR est considéré comme une liste de
commandes shell. Cela ressemble à un appel de sous-programme sans paramètre

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
156

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
157

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
158

 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
}

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
159

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
160
menu()
{
..
Remarques :
} On notera la différence entre les paramètres
traitemement() passés au shell-script et ceux passés aux
{
fonctions. Le $1 (le nom du fichier à traiter) du
..
} programme n'est pas le $1 de erreur (le
erreur() nombre de paramètres passés au programme).
{ Les variables créées dans des sous-
if [ $1 -eq 1 ]
then
programmes ne sont pas purement locales à ces
echo "Le fichier $2 n'existe pas" fonctions, elles sont reconnues dans tout le
else fichier shell. En revanche, non seulement, elles
echo "Donnez un seul paramètre, pas $1"
sont détruites à la fin de l’exécution du fichier
fi
} shell mais encore, elles ne sont pas visibles dans
if [ -f $1 -a $# -eq 1 ] les processus engendrés. On peut les y rendre
then visibles par la commande interne export. Une
menu
traitement $1
fonction n’est pas exportable.
else
erreur $# $1
Support
fi : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Scripts Shell: exécution d'un script shell
161

 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.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: exécution d'un script shell
162

 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

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Scripts Shell: les commandes
163

 Contrôle des processus


 Lorsque des commandes sont lancées en arrière-plan et
qu’il est nécessaire de synchroniser la suite d’un
programme shell avec la fin de ces commandes, le
programme shell doit se bloquer en attente de la fin de
ces commandes par la commande interne wait.
 wait num suspend l’exécution jusqu’à ce que le
processus de n° num, ou tous les processus lancés en
arrière-plan, se terminent.

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques commandes
164
 INFORMATION ET AIDE
 man <commande> ou info <commande> permet d'obtenir de l'aide sur une commande (sous
réserve que les manuels aient été installés)
 whoami : nom d'utilisateur courant !
 who : utilisateurs actuellement connectés
 COMMANDES DE FICHIERS
 pwd : affiche le nom du répertoire courant.
 find : recherche un fichier
 cd : change pour un répertoire
 ls : affiche le contenu du répertoire (options innombrables .)
 file : tente de deviner le type du fichier.
 cp : copie de fichiers
 mkdir : création de répertoire
 mv : déplacement de fichiers
 rm : suppression de fichiers
 rmdir : suppression de répertoire (selement si vide .)
 chmod : changement des permissions d.accès au(x) fichiers.
 chown : changement de propriétaire (seulement autorisé au superviseur)
 chgrp : changement de groupe

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques commandes
165

 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++

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)


Quelques commandes
166
 ECRANS ET IMPRIMANTES
 Manipulation de fichiers textes
 cat : affiche le contenu du fichier, assez marrant sur un fichier binaire .
 more, less : affichage page par page d'un fichier
 head : affiche le début du fichier.
 tail : affiche la fin du fichier.
 grep : affichent les lignes de fichiers qui contiennent un motif (recherche d'expression régulières)
 sort : tri des lignes du fichier.
 wc : compte les lignes, mots ou caractères d'un fichier.
 Ecran
 clear : efface l'écran
 Imprimante
 lpr : imprime un fichier
 lpq : liste des fichiers en attente d'impression
 lprm : supprime un fichier de la file d'attente de l'imprimante
 Messages
 mail : envoie du courrier
 write : écrit un message sur l'écran de l'utilisateur
 talk : permet de communiquer d'un écran vers un autre
 wall : envoie un message à tous
Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)
Sommaire TP (15h/groupe)
167

 Utilisation de linux en ligne de commande


 Programmer en C sous linux:
 Edition d'un programme C,
 Compilation ,
 Exécution
 Programmation des processus:
 création des processus,
 communication inter-processus (tube, signaux, socket)
 Programmation en Shell
 A partir de la ligne de commandes
 Scripts Shell (édition, exécution)

Support : Programmation système et environnement Unix // Par: Dr Maurice TCHOUPE T. (UDS)

Vous aimerez peut-être aussi