TP 2
Création et communication entre
processus
Création de processus : fork
La
fonction fork permet de dupliquer un processus en créant un processus fils identique.
- Découverte de fork
- Consultez le manuel de la fonction
fork (utilisable en C). Quelles valeurs renvoie t'elle ?
- En utilisant
cette fonction, créez une petite famille (un père et son fils) de processus qui
affichent chacun leur identité.
- Vérifiez leur "parenté" en
affichant précisément la liste des processus (consultez les options de la commande
ps).
- Le processus fils a t'il récupéré les variables initialisées par
le processus père ? Démontrez le.
- Fork multiples
- Créez
une descendance complète de processus avec trois niveaux de branches (grand-père,
père, fils).
- Créez un programme avec une boucle (n itérations
par exemple) à l'intérieur de laquelle est exécuté
un fork. Réalisez des affichages de PID et PPID pour comprendre ce qu'il
se passe. Combien génère t'on de processus en fonction de n ?
- Quel
serait un bon style de programmation pour gérer de multiples fork dans
un programme ?
- Processus orphelins : si un processus père
meurt avant son fils ce dernier devient orphelin.
- Créez une descendance
complète de processus (grand-père, père, fils). Ces processus doivent durer longtemps
(utilisez la fonction sleep). Que se passe t'il si on coupe la branche au niveau
du grand-père. Tuez le processus correspondant et vérifiez l'état des processus
restants. Existe t'il des processus orphelins ? A quels processus ont-ils été
rattachés ?
- Stoppez maintenant le processus au niveau 2 (père). Vérifiez
l'état des processus restants. Existe t'il des processus orphelins ? A quels processus
ont-ils été rattaches ?
- Pourquoi un processus ne peut-il rester sans processus
père ?
- Processus zombies : si un fils meurt avant que son
père ne se termine, celui-ci devient un processus zombie : il ne consomme pas
de ressource système, mais a une entrée dans la table des processus.
- Recréez une descendance complète de processus (grand-père, père, fils). Ces
processus doivent durer longtemps (utilisez la fonction sleep). Que se passe t'il
si on coupe la branche au niveau du fils. Tuez le processus correspondant et vérifiez
l'état des processus restants. Existe t'il des processus zombies ? Quelles sont
les caractéristiques de ces processus zombies ?
- Stoppez maintenant le processus
au niveau 2 (père) . Vérifiez l'état des processus restants. Existe t'il des processus
zombies ?
- Wait
- Consultez le manuel des fonctions wait
et waitpid.
- Utiliser la fonction wait pour qu'un père attende la
terminaison d'un fils, ou bien acquitte cette dernière (dézombification).
- Vérifiez
que vous pouvez bien récupérer le code de terminaison (celui qui
est passé à exit) d'un processus fils particulier dans la variable
status passé à waitpid (un père lance deux fils, et attend
la terminaisons du second pat exemple).
Passage de
paramètres à un programme C
La déclaration d'un programme
principal en C se fait de la manière suivante : int main(int argc, char*
argv[]), où argc est le compteur de paramètres, et argv un tableau
de chaînes de caractères contenant ces paramètres.
- Créez
un programme C qui affiche les valeurs de argv et de argv. Compilez et testez
avec 0 ou plusieurs paramètres de tous types.
- Créez le programme
C param qui doit pouvoir s'appeler de la manière suivante : "param
-c 12 tata.doc" ou "param tata.doc", qui dans le premier cas affichera
12 fois le nom tata.doc, dans le deuxième une seule fois, et renverra un
message d'erreur dans les autres cas.
- Testez (avec une commande standard,
par exemple ls, puis avec param) la commande "echo $?" qui permet de
récupérer dans le shell le retour du dernier programme lancé.
Lancement
de programme dans un shell ou un programme
Diverses commandes shell (exec)
ou C (execl, execve...) permettent d'exécuter des processus en remplaçant un processus
par le code d'un autre.
- Étudiez a l'aide du manuel la famille
des commandes exec.
- Tapez dans une fenêtre : exec ls /usr/bin. Que constatez-vous
?
- En prenant deux fenêtres différentes, tapez exec du / dans une des fenêtres.
Observez la liste des processus avant et après l'appel de cette commande. Que
constatez-vous ?
- Utilisez les commandes execl et execv pour lancer des
commandes telles que "ls /usr/bin" ou "param -c 12 tata.doc".
A quoi sert le code C situé après une fonction de la famille exec
?
Duplication de processus et remplacement de
code
- Créez deux programmes (excutables) différents : fils1 et fils2,
qui affichent des messages différents à l'écran. Créez un troisième processus,
le processus maître qui lance les deux processus fils. Expérimentez le bon fonctionnement
des processus en vérifiant la parenté des processus générés par le maître.
- Créez
un programme qui attend l'entrée d'un chiffre au clavier, et retourne celui-ci
à la terminaison. Créez un processus père qui lance ce programme
tant que le chiffre rentré n'est pas 0.
D'après un TP
de Laurent Lefèvre (mars 2001), modification/extension Yannick Prié
(février 2002).