TD Introduction aux Systèmes d’Exploitation - Série 2
Objectif : Maîtriser les Appels Systèmes (fork, wait et exec) pour la
Création et Recouvrement de Processus.
Rappel :
Exemple d'utilisation de la fonction ” fork ( ) ”
# include <unistd.h>
# include <stdio.h>
...
int pid;
pid = fork ( );
if (pid == - 1)
{/*code si échec: printf (” le fork ( ) a échoué \n ”)*/}
if (pid == 0)
{ /* code exécuté par le processus fils */ }
else
{ /* code exécuté par le processus père */ }
...
Exercice 1 :
Objectif : Apprendre à utiliser les Données en cas de Fork
Considérer le programme suivant :
#include <stdio.h>
#include <unistd.h>
int i = 0;
int main(void)
{
if (fork())
printf("Je suis le père, i vaut %d\n", ++i);
else
printf("Je suis le fils, i vaut %d\n", ++i);
return 0;
}
Dire ce qui est affiché par ce programme, et dans quel ordre.
1
Exercice 2 :
Objectif : Apprendre à Tracer un Arbre de Processus (fork)
Considérez le programme C suivant :
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
int p1, p2, p3, p4;
if ((p1=fork( ))==0)
if ((p2=fork( ))==0)
f2( );
else
f1( );
else
if ((p3=fork())==0)
f3( );
else
if ((p4=fork())==0)
f4( );
sleep (3);
while (wait (NULL)>0) ;
}
1) Tracez l'arborescence des processus créés par ce programme si les fonctions f1, f2, f3 et f4 se terminent
par exit().
2) Ce programme produit-il des processus zombies? Justifiez.
Exercice 3 :
Objectif : Apprendre à interpréter des Itérations comprenant fork
Soit le programme suivant :
/* Fichier pere_fils1.c */
#include <unistd.h>
#define N ...
void main ()
2
{ int i;
int pid, ppid, npid;
pid = (int) getpid();
printf(’’ Debut du processus n° : %d \n’’, pid );
for ( i = 1 ; i < N ; i++ )
{
npid = ( int ) fork();
pid = (int) getpid();
ppid = (int) getppid();
printf(’’Le processus est %d , le père est : %d’’, pid,ppid) ;
}
printf(’’ \t \t \t Fin du processus n° : %d \n’’, pid );
}
Combien de processus sont créés pour N=2, N=3, N=4... ? Donner l’arborescence des processus.
Exercice 4 :
Objectif : Apprendre à développer un interpréteur de commande en utilisant les fonctions système
fork, wait et exec.
Ecrire un programme shell (interpréteur de commandes) qui affiche le prompt, lit une commande
provenant du terminal, crée un fils, attend qu'il exécute la commande et lit la commande suivante quand le
fils se termine.
Pour afficher le prompt et lire la commande, utiliser respectivement les fonctions void type_prompt(void)
et void read_cmde(char *commande, char * parametres []) sans écrire leurs codes.