Académique Documents
Professionnel Documents
Culture Documents
Pr HANIN
2021/2022
Plan
o La fonction getpid()
o La fonction getppid()
o La fonction fork()
o La fonction wait()
o La fonction waitpid()
o La fonction sleep()
o La fonction exit()
o Exercices
Chaque processus s’exécutant sur un système est repéré par un numéro d’identification de type
entier. On l’appelle communément PID pour « Process Identification ».
int main()
{ int d;
d=getpid();
printf("Le PID du processus qui exécute ce programme est: %d",d);
}
En langage C: la fonction getppid() permet de retourner le PID du processus père (c.-à-d. le PPID)
d’un processus donné.
int main()
{ int d;
d=getppid();
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid=getpid();
ppid = getppid();
Remarque: Les deux processus se terminent lors de la fin de l’exécution de leurs codes respectifs.
Rien ne garantit que l’un ou l’autre se terminera avant. Tout dépend de l’ordonnancement des
processus au niveau système.
Le code s’exécutant deux fois à partir de la fonction fork(), il est donc normal d’envisager que
cette fonction retourne une valeur pour chacun des deux processus. Il y a un résultat pour le
processus père, et un résultat pour le processus fils.
On se sert donc de cette propriété pour différencier les codes pour les parties père et
fils.
La fonction fork() provoque non seulement la naissance d’un nouveau processus, mais aussi la
duplication des zones mémoires. En effet, chaque processus a son propre espace de mémoire. À la
création du nouveau processus, les variables utilisées dans le processus père restent inchangées et
continuent leur évolution. Le processus fils bénéficie des mêmes variables et des mêmes valeurs,
mais dans des zones mémoires différentes.
Ces variables du fils évolueront différemment de celles du processus père. Ce sont des variables
distinctes. Elles ne sont pas partagées entre les différents processus (père et son fils).
La fonction wait() marche forcément du père vers le fils. Il ne faut pas aussi qu’il y ait des
ambiguïtés sur les processus qui meurent. En effet, si un processus génère deux fils (deux
fonctions fork). Une fonction wait() attendra la mort d’un des fils. Il est impossible de savoir
lequel des deux fils a débloqué le père. D’où l’utilisation de la fonction:
-1 attendre la fin de n’importe quel fils. C’est le même comportement que wait().
En cas de réussite, le PID du fils qui s’est terminé est renvoyé, en cas d’échec -1 est renvoyé.
int main()
{ int n, pid;
n=0;
pid=fork();
if(pid==0)
{ printf("n=%d",n+2);
}else
{ sleep(10);
printf("n=%d",n+1);
}
}
Pr. HANIN Chapitre 2: Création/Manipulation des processus 18
La fonction sleep()
int main()
{ int n, pid;
n=0;
pid=fork();
if(pid==0)
{ printf("n=%d",n+2);
}else
{ sleep(100);
printf("n=%d",n+1);
}
}
exit(n) met fin au processus courant avec le code de retour n (par convention, le code
de retour après un comportement correct est 0). Bibliothèque: #include <stdlib.h>
int main()
{ int pid;
pid=fork();
if(pid==0)
{ printf("Je suis le processus fils\n");
}else
{ exit(0);
printf("Je suis le processus père\n");
}
}
int main()
{ int pid;
pid=fork();
if(pid==0)
{ printf("Je suis le processus fils \n");
exit(0);
printf("Bonjour S2\n");
}else
{
printf("Je suis le processus père \n");
}
}
int main()
pid=fork();
if(pid==0){
printf("n=%d",n+2);
sleep(100);
}else{
exit(0);
printf("n=%d",n+1);
}
}
Pr. HANIN Chapitre 2: Création/Manipulation des processus 22