TP n°3 : Operations sur les processus (1)
Exercice 1 : le programme suivant illustre le comportement de l’appel system « fork »
#include <stdio.h> case 0 :
#include <unistd.h> printf (“Je suis le processus fils\n”);
int main () break;
{int code_retour ; default :
code_retour = fork (); printf (“Je suis le processus père et
switch (code_retour ) { je viens de créer le processus fils
case –1 : dont le pid est %d
printf (“Problème lors de la création \n”,code_retour);
du processus\n”); break; }
break; return 0 ; }
1. Exécutez ce programme puis expliquez le résultat obtenu.
Exercice 2 : soit le programme P3 suivant :
#include <stdio.h> p = fork();
#include <unistd.h> if (p == 0){ p = fork(); }
int main () else{ p = fork(); }
{int p; return 0 ; }
1. Donnez les résultats de l’exécution du programme ci-dessous en supposant que l'identificateur du processus (PID)
correspondant à ce programme est 2500 et que le système affecte des identificateurs séquentiels aux nouveaux
processus.
Exercice 3 : soit les programmes suivants :
/*Programme 1*/ /*Programme 2*/ /*Programme 3*/
#include <stdio.h> #include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h> #include <unistd.h>
Int main () Int main () int main ()
{ int p,i,n; { if (fork()||fork()) { if (fork()&&(!fork()))
For (i=0;i<n;i++) { { fork(); } { if (fork()||fork()){
fork(); printf("PID %d fork();}}
If (p==0){printf(“%d \n",getpid());
printf("PID %d
\n”,getpid()); }
Return 0;}} \n",getpid());
}
1. Combien de processus donnera le programme 1 pour n=3
2. Donnez l’arbre des processus engendré par les trois programmes
Exercice 4 : Donnez un programme en C qui crée 4 processus fils, ou chaque processus fils doit afficher dans l'ordre, les
entiers de 1 à 3 à partir de la structure suivante :
For (i=0 ;i<4 ;i++) {
Switch (fork())
{ case -1 : ……break ;
case 0 : ……break ;
default : ……break;
}} return 0;}
1
Exercice 5 :
1. getpid() : donnez un programme en C qui utilise la fonction fork() pour créer un processus fils à partir du
processus père. Le programme devra afficher des messages distincts pour le processus père et le processus fils,
chacun indiquant son propre PID (identifiant de processus), un message d’erreur devrait être affiché si la création
du processus renvoi une valeur de -1
les bibliothèques qui doivent être utilisées :
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
2. wait() : donnez un programme en C qui crée un processus fils en utilisant la fonction fork() et utilise la
fonction wait() pour que le processus père attende la fin du processus fils avant de continuer son exécution.
Un processus fils devrait être créer en utilisant l ‘appel système fork ()
Il devrait affiché son pid
Attendre 10 seconde (sleep(10))
Puis afficher un message indiquant qu’il a fini d’attendre et exécute un return 0
en parallèle le processus père devrait attendre le processus fils en exécutant la fonction wait (NULL)
Si la valeur de retour est a -1 le processus père exécute la fonction exit(EXIT_FAILURE)
Sinon si la valeur de retour est supérieur a 0 la valeur devrait être affiché par le processus père qui est considéré
comme PID du fils
les bibliothèques qui doivent être utilisées :
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
3. waitpid()
#include<stdio.h> /*création second fils*/
#include<sys/types.h> pid2 = fork();
#include<unistd.h> if (pid2 < 0) {
#include<stdlib.h> printf("Erreur lors de la création du
#include<sys/wait.h> deuxième processus fils\n");
return 1;}
int main() { else if (pid2 == 0) {
pid_t pid1, pid2; sleep(2);
int status; printf("Fils 2 (PID=%d) : Tâche
/*création premier fils*/ terminée\n", getpid());
pid1 = fork(); return 0;}
if (pid1 < 0) { /*attente du premier fils*/
printf("Erreur lors de la création du waitpid(pid1, NULL, 0);
premier processus fils\n"); printf("Processus parent (PID=%d) : Fils
return 1;} 1 (PID=%d) s'est terminée", getpid(),
else if (pid1 == 0) { pid1);
sleep(4); /*attente du second fils*/
printf("Fils 1 (PID=%d) : Tâche waitpid(pid2, NULL, 0);
terminée\n", getpid()); printf("Processus parent (PID=%d) : Fils
return 0 ;} 2 (PID=%d) s'est terminée", getpid(),
pid2);
return 0 ;}
1. Remplacez waitpid(pid,NULL,0) avec pid = wait(NULL) pour les deux processus. Que remarquez-
vous ?
Dr. M. Baba Ahmed
2