TP processus
B. Dupouy et S. Gadret
| 1ère partie | Exemples à faire fonctionner |
| 2ème partie |
Exercice à rendre. L'envoyer par mail à l'enseignant qui vous fait les , par exemple : dupouy@enst.fr Le texte du sujet ( subject ) doit contenir le mot : TPAST pour les AST maîtrises TP1A pour les éléves de 1ère année |
who (liste des utilisateurs connectés) who am i (qui suis-je ...) ps -l (liste des processus attachés au terminal) ps -edf (liste des processus présents sur le système) ps -axl (idem avec plus de détails) ou ps -ael ...suivant le système utiliséOn remarquera les différents processus :
ps -l (liste des processus attachés au terminal courant)
sleep 20& (processus qui dort pendant 20s en arrière plan)
sleep 30& (processus qui dort pendant 30s en arrière plan)
ps -l (pour voir la nouvelle configuration de processus et constater
que le processus qui exécute le shell a plusieurs
processus fils, chacun faisant tourner le programme sleep)
cd Pour aller dans le home directory mkdir TPProc cd TPProc
gcc exo1.c -o exo1
ou, mieux :
gcc -Wall exo1.c -o exo1
Sur une machine multi-processeur on peut avoir à forcer l'exécution sur un seul processeur, dans ce cas il faut utiliser la commande
taskset, par exemple :
taskset -c 0 ./exo1
On va tout d'abord utiliser les fonctions UNIX suivantes :
Pour récupérer le programme suivant : fork-mul.c,
cliquer ici.
Compiler fork-mul.c, puis l'exécuter.
Après exécution et à l'aide du schéma suivant, relever les numéros des processus et numéroter l'ordre d'exécution des instructions printf de façon à retrouver l'ordre d'exécution des processus.
Remarque:
si on relève un numero de processus égal
à 1, il s'agit du processus init, père de tous
les processus. Init adopte les processus orphelins, c'est à
dire qu'un processus dont le père s'est terminé devient fils de
1, et getppid() renvoie 1.
|
Quand un processus se termine, le signal SIGCHILD est envoyé à son père. La recéption de ce signal fait passer le processus père de l'état bloqué à l'état prêt. Le processus père sort donc de la fonction wait.
La valeur de retour de wait est le numéro 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
wait renvoie -1.
Chaque fois qu'un fils se termine le processus père sort de wait, et il
peut consulter Etat pour obtenir des informations sur le fils qui
vient de se terminer.
Etat est un pointeur sur un mot de deux octets :
Schéma résumant le contenu du mot pointé par Etat à la sortie de wait :
|
Compiler et exécuter fork-sync.c après l'avoir récupéré en cliquant ici.
La fonction exec charge un fichier dans la zone de code du processus qui l'appelle, remplaçant ainsi le code courant par ce fichier. Une des formes de cette fonction est execl :
int execl (char *fic, char * arg0, [arg1, ... argn,])
Commentaires :
execl ("prog", "prog", (char *)0)
Compiler puis exécuter le fichier fexec.c (il est
ici).
Pour en vérifier le bon fonctionnement, on fera exécuter par execl un fichier très simple,
par exemple celui dont le source est ci-dessous :
int main (void) {
printf("Bonjour, ici %d !\n", (int)getpid() );
sleep (4);
return 6;
}
D'après les exemples précédents, écrire un programme dont le fonctionnement est le suivant (compiler en utilisant l'option -Wall de gcc, il ne doit pas y avoir de warnings après la compilation) :
Pour obtenir un canevas du programme à écrire ainsi que des indications sur l'utilisation de argc, argv et sur la création des N fils, cliquer ici.