Vous êtes sur la page 1sur 2

Université de Blida 1 Système d’exploitation

ème
Département d’informatique 2 année LMD

Série 2 :
Création de processus (fork) Sous Linux
Fonction fork :

int fork() : cette primitive crée un nouveau processus (appelé fils) qui est une copie exacte du
processus appelant (processus père). La différence est faite par la valeur de retour de fork(),qui est
égale à zéro chez le processus fils, et elle est égale au pid du processus fils chez le père.

La primitive renvoie -1 en cas d’erreur.


Exercice 1 :

Ecrire un programme qui permet de créer un processus fils en utilisant la fonction fork(). Ajouter la
fonction exit(0) pour sortir en cas d’erreur. Ajouter des instructions qui permettent d’afficher
l’identifiant de chaque processus.

Exercice 2 :

Qu'affiche l'exécution du programme suivant :

void main()
{
int pid; int x = 1;
pid = fork();
if (pid == 0) {
printf("x=%d\n", ++x);
exit(0);
}
printf(" x=%d\n", --x);
}
Que serai l’affichage si on enlève l’instruction exit(0) ?

Exercice 3 :

Réaliser le programme correspondant à l’arborescence suivante :

Remarque : chaque processus devra afficher son pid et le pid de son parent.

Père

Fils1 Fils2

Fils1.1 Fils1.2

1/2
Université de Blida 1 Système d’exploitation
ème
Département d’informatique 2 année LMD

Exercice 4 :

Combien de lignes ((hello !)) imprime chacun des programmes suivants :

main() main() main()


{ { {
fork(); /*1*/ fork(); /*1*/ if (fork()) /*1*/
fork();/*2*/ fork(); /*2*/ fork(); /*2*/
printf("hello!\n"); fork();/*3*/ printf("hello!\n");
} printf("hello!\n"); }
}

Dessinez l’arborescence des processus (père qui représente le programme principal main et les fils
crée par fork) de chaque programme.

Exercice 5 :

Dessinez l’arborescence des processus (père qui représente le programme principal main et les fils
crée par fork) du programme suivant. Et indiquez pour chacun les valeurs des variables i et j
(initiales, intermédiaires et finales) :

void main()
{
int i, j, k ; i=j=2;
k=fork(); /*1*/
if(k==0){
i=i+2; k=fork(); /*2*/
if(k==0) j=j+4;
else i=i+1;
exit(1);
}
else {
k=fork(); /*3*/
if(k==0) j=j+20;
else {
i=i+20;
j=i+10;
}
}
i=j+50;
}

2/2