Académique Documents
Professionnel Documents
Culture Documents
L’objectif de ce TP est d’approfondir les notions relatives aux processus et de les appliquer.
La commande fork() crée un processus fils du processus appelant (le père), avec le même programme que ce
dernier. La valeur renvoyée par fork() est :
• Au père : le numéro (pid) du processus fils.
• Au fils : 0 (il peut retrouver le pid de son père avec getppid())
En cas d’échec (table des processus pleine), aucun processus n’est créé, et la valeur −1 est renvoyée.
Question : Qu’affiche l’exécution des programmes suivants :
Code 1 Code 2
#include <stdio.h> # include < std io . h>
#include <unistd.h> # include <sys / types . h>
Void main () int f ( int x ) { /∗ code de f . . . ∗/ }
{ int g ( int x ) { /∗ code de g . . . ∗/ }
int code_retour ; printf (“Début du test fork ()\n”); int main () {
code_retour = fork (); int v=0 , x ; pid_t n ;
switch (code_retour ) { printf ( " Pid : %d \ n" , ( int ) getpid ( ) ) ;
case –1 : printf (“Pbm lors de la création du processus\n”); /∗ Essai de calcul pour x=3 ∗/ x = 3;
break; n = fork ( ) ;
case 0 : printf (“Je suis le processus fils \n”); break; if (n != 0) v = v + f ( x ) ; else v = v + g ( x ) ;
default : printf (“Je suis le processus père\n”); printf (“Je viens printf ( " Valeur de v : %d , mon pid : %d \ n" , v , ( int
de créer le processus fils ) getpid ( ) ) ; return 0;
dont le pid est %d \n”,code_retour); break; } }
printf (“code_retour %d\n”, code_retour); printf (“Fin du test
fork ()\n”); Remarque:
}
Remplacer les deux fonctions f et g par le code suivant: srand (
getpid ( ) ) ;
sleep ( 2 ) ;
return ( random ()%2);
Code3 :
#include <stdio.h> int main() {
int i, j ;
/* boucle pour créer les 10 processus fils */
for (i=0; I < 10; i++) {
switch (fork()) {
case -1 : fprintf(stderr, « Erreur dans %d\n », getpid()) ; perror(« fork ») ;
exit(1) ;
case 0 : /* On est dans un fils */ for (j = 0; j < 10; j++) { printf(“%d”,i);
fflush(stdout) ;
}
/* Ne pas oublier de sortir sinon on crée fact(10) processus */ exit(0) ;
default : /* On est dans le père ; ne rien faire */ ;
}
}
/* 2ème boucle, attendre les 10 fils */ for (i=0; I < 10; i++) {
wait(NULL);
}
exit(0) ;
}
Code 4: