Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

TP2 Se2

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 2

Le 05 novembre 2023

UNIVERSITE Mohamed Khider BISKRA


Département d’Informatique
Systèmes d’exploitation II
Année Universitaire 2023/2024

TP n°2 : Communication Inter-Processus en C++ - Tubes de communication

Problème 1 :

Dans ce problème, on crée deux tubes p1 et p2 pour faire communiquer les deux processus :

• le père a accès en écriture sur p1 et en lecture sur p2,


• le fils a accès en écriture sur p2 et en lecture sur p1.

#include < stdio . h>


#include <unistd . h>
# define NB_ENTIERS 5
void fils ( int p1 [2] , int p2 [2])
{
int i , nombre , nb_lus ;
close ( p1 [1] ) ; /∗ Fermeture du tube p1 en écriture pour le fils . ∗/
close ( p2 [0] ) ; /∗ Fermeture du tube p2 en lecture pour le fils. ∗/
nb_lus = read ( p1[0] ,&nombre , sizeof ( int ) ) ; /∗ Lecture nombre sur p1 . ∗/
while ( nb_lus == sizeof ( int ))
{
nombre = nombre ∗2; /∗ Calcul du double . ∗/
printf( " Les doubles sont :%d \ n" , nombre ) ;
write ( p2 [1] ,& nombre , sizeof ( float ) ) ; /∗ Ecriture double sur p2 . ∗/
nb_lus = read ( p1 [0] ,&nombre , sizeof ( int ) ) ; /∗ Lecture nombre sur p2 . ∗/
}
close ( p1 [ 0 ] ) ; /∗ Fermeture du tube p1 en ecriture pour le fils.∗/
close ( p2 [ 1 ] ) ; /∗ Fermeture du tube p2 en lecture pour le fils . ∗/
exit ( 0 ) ;
}
int main ()
{
int i , nombre , p1 [2] , /∗ Descripteurs du tube p1 . ∗/
p2 [ 2 ] ; /∗ Descripteurs du tube p2 . ∗/
pipe ( p1 ) ; /∗ Creation du tube p1 . ∗/
pipe ( p2 ) ; /∗ Création du tube p2 . ∗/
if ( fork () == 0) /∗ Creation du fils . ∗/
fils (p1 , p2 ) ; /∗ Code du fils. ∗/
else { close ( p1 [ 0 ] ) ; /∗ Fermeture du tube p1 en lecture pour le père . ∗/
close ( p2 [ 1 ] ) ; /∗ Fermeture du tube p2 en écriture pour le père . ∗/
for ( i = 0; i < NB_ENTIERS; i ++) {

1
printf( " Entrez un entier \ n" ) ; /∗ Demande d ’un entier . ∗/
scanf ( " %d",&nombre ) ; /∗ Saisie d ’un entier . ∗/
write ( p1 [1] ,&nombre , sizeof ( int ) ) ; /∗ Ecriture de l ’ entier sur p1 . ∗/ }
close ( p1 [ 1 ] ) ; /∗ Fermeture du tube p1 en écriture pour le père . ∗/
printf( " Les doubles sont : \ n" ) ;
for ( i = 0; i < NB_ENTIERS; i ++)
{
read ( p2 [0] ,&nombre , sizeof( int ) ) ; /∗ Lecture d ’un entiersur p2 . ∗/
printf( "%d " , nombre ) ; /∗ Affichage de l’entier. ∗/ }
printf( " \ n" ) ; /∗ Important pour forcer l ’ affichage . ∗/
close ( p2 [ 0 ] ) ; /∗ Fermeture du tube p2 en lecture pour le père . ∗/
}
return 0;
}
Problème 2 : Que se passe t’il pendant l’exécution du programme suivant ?

1 #include <stdlib.h> 25 void fils2(void)


2 #include <stdio.h> 26 {
3 #include <unistd.h> 27 char c;
4 #include <sys/wait.h> 29 close (p[1]);
6 int p[2]; 30 printf("debut fils2\n");
8 void fils1(void) 31 while (read(p[0],&c,1) > 0) ;
9{ 32 printf("fils2 re¸coit >%c<\n",c);
10 char c; 33 close(p[0]);
12 close(p[0]); 34 exit(EXIT_SUCCESS);
13 printf("d´ebut fils1 (taper 0 pour finir)\n"); 35 }
14 while ( (c=getchar()) != ’0’ ) 37 int main(void)
15 if ( (c >= ’A’ && c <= ’Z’) || (c >= ’a’ && c <= ’z’) ) 38 {
16 { 39 if (pipe(p) != 0)
17 if ((c >= ’a’) && ( c <= ’z’)) c-=32; 40 {
18 write(p[1],&c,1); 41 printf("pb ouverture pipe \n");
19 printf("Le fils1 envoie >%c<\n",c); 42 exit(EXIT_FAILURE);
20 } 43 }
21 close(p[1]); 44 if (fork()==0) fils1();
22 exit(EXIT_SUCCESS); 45 if (fork()==0) fils2();
23 } 46 close(p[0]);close(p[1]);
47 wait(NULL);wait(NULL);
48 printf("fin du p`ere\n");
49 exit(EXIT_SUCCESS);
50 }
Questions :

1. Comment pourriez-vous remplacer les entrées/sorties C (printf, scanf) par les entrées/sorties
C++ (std::cout, std::cin) pour une utilisation plus orientée objet, en incluant la bibliothèque
<iostream> ?

2. Créez des classes C++ pour gérer la communication entre processus, encapsulant la logique
du tube et de la communication. Pour créer des classes C++ pour gérer la communication
entre processus en encapsulant la logique des tubes et de la communication, vous pouvez
suivre une approche orientée objet. On pourra par exemple utiliser deux classes : une qu’on
appellera class Pipe pour gérer la création de tubes et une autre class
ProcessCommunication pour la communication entre les processus.

Vous aimerez peut-être aussi