Vous êtes sur la page 1sur 2

UNIVERSITE Mohamed Khider BISKRA

Faculté des sciences exactes et des sciences de la nature et de la vie


Département d’Informatique
Module : Systèmes d’exploitation 2. Année Universitaire 2023/2024

TP n°1 : Création de processus.

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:

#include <stdlib.h> /* exit, atoi */


#include <stdio.h> /* printf */
#include <unistd.h> /* getpid, fork */
#include <wait.h> /* wait */
void arbre(int n) { int i;
printf("Lance %d processus en arbre\n\n",n); printf("proc %d fils de %d (shell)\n",getpid(),getppid()); for (i=0; i<n; i++) {
if (fork() == 0) { /* fils */
printf("proc %d fils de %d\n",getpid(),getppid());
}
else {
// wait(NULL); pas de wait, ou les pères quittent pas assez vite exit(0);
}
}
}
void chaine(int n) { int i;
printf("Lance %d processus en chaine\n\n",n); printf("proc %d fils de %d (shell)\n",getpid(),getppid()); for (i=0; i<n; i++) {
if (fork() == 0) { /* fils */
printf("proc %d fils de %d\n",getpid(),getppid()); exit(0);
}
}
for (i=0; i<n; i++) wait(NULL);
}
int main(int argc, char *argv[ ]) { if (argc<2) {
printf("Usage:\n%s 1 <n> pour lancer <n> processus en arbre\n%s 2 <n> pour lancer <n> processus en chaine\n",
argv[0], argv[0]); exit(1);
}
switch(atoi(argv[1])) {
case 1: arbre(atoi(argv[2])); break; case 2: chaine(atoi(argv[2])); break;
}
return 0;

Vous aimerez peut-être aussi