Vous êtes sur la page 1sur 6

14/2/2014

TP processus

BCI Informatique
TP processus
B. Dupouy et S. Gadret

SOMMAIRE

1.
2.
3.
4.

Organisation du TP :
Utilisation des commandes du shell
Introduction aux exercices en C
Cration de processus (fonction fork)
1. Fonctions utilises
2. Exercice 1
3. Exercice 2
5. Synchronisation de processus pre et fils (mcanisme wait/exit)
1. Fonctions utilises
2. Mcanisme wait/exit
6. Pre et fils excutent des programmes diffrents
1. Fonction utilise
2. Fonctionnement de exec
7. Exercice rendre

Organisation du TP:
1re partie Exemples faire fonctionner
Exercice rendre. L'envoyer par mail l'enseignant
qui vous fait les , par exemple : dupouy@enst.fr
2me partie Le texte du sujet ( subject) doit contenir le mot :
TPASTpour les AST matrises
TP1Apour les lves de 1re anne

Documentation
Le support de cours sur les processus se trouve ici.

I.Utilisation des commandes du shell


http://www.infres.enst.fr/~domas/BCI/Proc/TPproc.html

1/6

14/2/2014

TP processus

Les exercices suivants s'attachent montrer les diffrences entre processus et utilisateur et mettre en
vidence quelques points importants du systme Unix.
1. Pour constater la diffrence utilisateur/processus, on essaiera la squence de commandes suivantes:
who
who am i
ps -l
ps -edf
ps -axl
ou
ps -ael

(liste des utilisateurs connects)


(qui suis-je ...)
(liste des processus attachs au terminal)
(liste des processus prsents sur le systme)
(idem avec plus de dtails)
...suivant le systme utilis

On remarquera les diffrents processus :


init de pid 1 et le swapper-scheduler de pid 0.
les dmons (nots ?),
ceux qui droulent un shell (sh, csh ou ksh),
2. Accs au systme. Voir, en les listant avec les commandes ypcatou getent, le contenu des fichiers
suivants :
passwd (commande : ypcat passwd ou getent passwd ) (fichier utilis par login),
hosts (commande : ypcat hosts ou getent hosts ) (fichier contenant la liste des
machines connues),
3. Envoi d'une commande en arrire plan (option &) : sleep nmet le processus qui l'excute en pause
pendant n secondes.
Envoyer la squence suivante et observer la filiation des processus :
ps -l
(liste des processus attachs au terminal courant)
sleep 20& (processus qui dort pendant 20s en arrire plan)
sleep 30& (processus qui dort pendant 30s en arrire plan)
ps -l
(pour voir la nouvelle configuration de processus et constater
que le processus qui excute le shell a plusieurs
processus fils, chacun faisant tourner le programme sleep)

4. Effet de la commande exec.


1. Faire : exec ps
que se passe-t-il et pourquoi ?
Indication : pour exec, comme pour quelques autres commandes (built-in commands) le
shell ne cre pas de nouveau processus, c'est qu'il ne fait pas appel fork(cf. man exec).
2. Travailler dans une nouvelle fentre,
3. Entrer maintenant la commande : zsh,
4. Relever le numro du processus qui fait tourner ce nouveau shell courant (en faisant ps -l),
5. Faire maintenant : exec ps -l.
Relever le piddu processus qui excute ce programme ps -l.
Quelle est sa valeur et pourquoi ?

II.Introduction aux exercices en C


Crer un rpertoire appel TPProcdans lequel vous travaillerez :
cd
mkdir TPProc
cd TPProc
http://www.infres.enst.fr/~domas/BCI/Proc/TPproc.html

Pour aller dans le home directory

2/6

14/2/2014

TP processus

Par la suite, pour compiler les fichiers et crer les excutables, utiliser la commande gcc.
Par exemple (premier exercice) :
gcc exo1.c -o exo1

ou, mieux :
gcc -Wall exo1.c -o exo1

Sur une machine multi-processeur on peut avoir forcer l'excution sur un seul processeur, dans ce cas il
faut utiliser la commande taskset, par exemple :
taskset -c 0 ./exo1

III. Cration de processus (fonction fork)


III.1 Fonctions utilises
On va tout d'abord utiliser les fonctions UNIX suivantes :
fork() :

Cette fonction va crer un processus. La valeur de retour nde cette fonction indique :
n> 0
On est dans le processus pre,
n= 0
On est dans le processus fils,
n = -1
fork a chou, on n'a pas pu crer de processus.
getpid():
Cette fonction retourne le numro du processus courant.
getppid():
Cette fonction retourne le numro du processus pre.

III.2 Exercice 1
1. Aprs compilation de exo1.c, on excutera le programme exo1plusieurs fois.
Pourquoi cinq lignes sont-elles affiches alors qu'il n'y a que deux printfdans le programme ?
Pour rcuprer ce programme exo1.c, cliquer ici.
2. Ajouter maintenant la ligne suivante derrire l'appel fork:
if (valeur == 0) sleep (4);

Que se passe-t-il ? Pourquoi ?

III. 3 Exercice 2
Pour rcuprer le programme suivant : fork-mul.c, cliquer ici.
Compiler fork-mul.c, puis l'excuter.
Aprs excution et l'aide du schma suivant, relever les numros des processus et numroter l'ordre
d'excution des instructions printfde faon retrouver l'ordre d'excution des processus.
http://www.infres.enst.fr/~domas/BCI/Proc/TPproc.html

3/6

14/2/2014

TP processus

Remarque:
si on relve un numero de processus gal 1, il s'agit du processus init, pre de tous les processus. Init
adopte les processus orphelins, c'est dire qu'un processus dont le pre s'est termin devient fils de 1, et
getppid()renvoie 1.

IV.Synchronisation de processus pre et fils


(mcanisme wait/exit)
IV.1 Fonctions utilises
exit( i ) :

termine un processus, iest un octet (donc valeurs possibles : 0 255) renvoy dans une variable du
type intau processus pre.
wait( &Etat ):
met le processus en attente de la fin de l'un de ses processus fils.
Quand un processus se termine, le signal SIGCHILDest envoy son pre. La recption de ce signal
fait passer le processus pre de l'tat bloqu l'tat prt. Le processus pre sort donc de la fonction
wait.
La valeur de retour de waitest le numro du processus fils venant de se terminer.
Lorsqu'il n'y a plus (ou pas) de processus fils dont il faut attendre la fin, la fonction waitrenvoie -1.
Chaque fois qu'un fils se termine le processus pre sort de wait, et il peut consulter Etatpour obtenir des
informations sur le fils qui vient de se terminer.
Etatest un pointeur sur un mot de deux octets :

L'octet de poids fort contient la valeur renvoye par le fils ( ide la fonction exit( i )),
l'octet de poids faible :
contient 0dans le cas gnral,
En cas de terminaison anormale du processus fils, cet octet de poids faible contient la valeur du
signal reu par le fils.
Cette valeur est augmente de 80 en hexadcimal (128 dcimal), si ce signal a entrain la
sauvegarde de l'image mmoire du processus dans un fichier core.
http://www.infres.enst.fr/~domas/BCI/Proc/TPproc.html

4/6

14/2/2014

TP processus

Schma rsumant le contenu du mot point par Etat la sortie de wait:

IV.2 Mcanisme wait/exit


Compiler et excuter fork-sync.c aprs l'avoir rcupr en cliquant ici.

V.Pre et fils excutent des programmes


diffrents
V.1 Fonction utilise
La fonction execcharge un fichier dans la zone de code du processus qui l'appelle, remplaant ainsi le code
courant par ce fichier. Une des formes de cette fonction est execl:
int execl (char *fic, char * arg0, [arg1, ... argn,])

Commentaires :
ficest le nom du fichier excutable qui sera charg dans la zone de code du processus qui appelle
execl.

Si ce fichier n'est pas dans le rpertoire courant, il faut donner son nom complet (chemin absolu).
Les paramtres suivants sont des pointeurs sur des chaines de caractres contenant les arguments
passs ce programme (cf. argven C).
La convention UNIX impose que la premire soit le nom du fichier lui-mme et que le dernier soit un
pointeur nul.
Par exemple, si on veut charger le fichier appel progqui se trouve dans le rpertoire courant et qui
n'utilise auncun argument pass sur la ligne de commande :
execl ("prog", "prog", (char *)0)

V.2 Fonctionnement de exec


Compiler puis excuter le fichier fexec.c(il est ici).
Pour en vrifier le bon fonctionnement, on fera excuter par execlun fichier trs simple, par exemple celui
dont le source est ci-dessous :
int main (void) {
printf("Bonjour, ici %d !\n", (int)getpid() );
sleep (4);
return 6;
}
http://www.infres.enst.fr/~domas/BCI/Proc/TPproc.html

5/6

14/2/2014

TP processus

On peut excuter ce programme en lui passant diverses commandes en argument, par exemple, si
l'excutable s'appelle fexec:
fexec /usr/bin/xclock
fexec /bin/ps
fexec exo1 (si on a fait : gcc -Wall exo1.c -o exo1)
fexec /usr/bin/emacs
...

VI. Exercice rendre


D'aprs les exemples prcdents, crire un programme dont le fonctionnement est le suivant (compiler en
utilisant l'option -Wallde gcc, il ne doit pas y avoir de warningsaprs la compilation) :
il lit sur la ligne de commande (utiliser argcet argv) le nombre N de processus crer.
il cre ces N processus en faisant N appels fork(cf. plus loin la tche assigne ces processus).
Pour obtenir un canevas du programme crire ainsi que des indications sur l'utilisation de argc,
argv et sur la cration des N fils, cliquer ici.
il se met en attente (appel Pid_Fils = wait(&Etat)) de ces N processus fils et visualise leur
identit (Pid_Filset valeur de Etat) au fur et mesure de leurs terminaisons.
Pour attendre la fin de tous les fils, utiliser le fait que waitrenvoie la valeur -1quand il n'y a plus de
processus fils attendre.
Ce que fait chacun des processus fils Pi:
il visualise son pid (getpid) et celui de son pre (getppid),
il se met en attente pendant 2*isecondes (sleep (2*i)), visualise la fin de l'attente,
il se termine par exit (i).
Aprs avoir vrifi que le programme fonctionne correctement :
Faire en sorte que l'un des processus fils se termine anormalement (par exemple en faisant une division
entire par zro ou en drfrenant un pointeur nul) et constater que le systme ne renvoie pas zro
en poids faible de Etat, mais y dpose un indicateur d'erreur.
(Copyright) dupouy@enst.fr

http://www.infres.enst.fr/~domas/BCI/Proc/TPproc.html

6/6