4. Introduction
4
Les systèmes d’exploitation actuels offrent la possibilité
de créer plusieurs processus(threads) concurrents qui
coopèrent pour réaliser des traitements complexes d’une
même application.
Ces processus s’exécutent sur un même ordinateur
(monoprocesseur) ou multiprocesseur ou sur différents
ordinateurs, et peuvent s’échanger des informations
(communication inter processus).
5. Introduction
5
Il existe plusieurs mécanismes de communication
interprocessus :
Les données communes (variables,
fichiers, segments de données)
Les signaux
Les messages.
6. Introduction
6
Les threads (POSIX) d’un processus partagent :
La zone de données globales
Le code
La table des descripteurs de fichiers du processus.
Lors de la création d’un processus (fork) :
la table des descripteurs de fichiers est dupliquée
Les processus créateur et créé partageront le même pointeur de
fichier pour chaque fichier déjà ouvert lors de la création.
7. Les tubes de communications unix
7
Définition:
Les tubes (pipes) de communications permettent entre deux
ou plusieurs processus s’exécutant sur une même machine
d’échanger des informations.
Deux types :
Les tubes anonymes
Les tubes nommés, qui ont une existence dans
le systèmes de fichiers : Donc un chemin
d’accès
8. Les tubes Anonymes : Création
8
Un tube de communication est créé par l’appel système :
int pipe(int p[2])
Cette appel système crée deux descripteurs de fichiers, il
retourne, dans p, les descripteurs de fichiers créés.
• p[0] : contient le descripteur réservés aux
lectures à partir du tube.
• p[1] : contient le descripteur réservés aux
écritures dans le tube.
9. Les tubes Anonymes : Création
9
Les descripteurs crées sont ajoutés aux tables de
descripteurs de fichiers du processus appelant.
Seul le processus créateur du tube et ses descendants
peuvent accéder au tube. (Duplication de la table de
descripteurs de fichiers).
Si le tube n’est pas créé: manque d’espace, l’appel système
renvoie -1, sinon il retourne la valeur 0.
L’accès au tubes se fait via les descripteurs de fichiers.
12. Les tubes Anonymes
12
Communications unidirectionnels:
Les tubes anonymes sont, en général, utilisés entre un
processus père et son fils.
Scénario:
Père : Crée un tube.
Père : Crée un ou plusieurs fils
Père Lecteur
Fils Ecrivain
Ecrivain : ferme le fichier non utilisé : de lecture.
Lecteur : Ferme le fichier non utilisé : d’écriture
Les processus (lecteur et écrivain) communiquent en
utilisant les primitives read et write.
14. Les tubes Anonymes
14
Communications unidirectionnels:
Exemple 1:
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define R 0
#define W 1
int main()
{
int pid;
int fd[2];
char message[100];
int Nboctects;
char* phrase="VOICI MON MESSAGE POUR TOI PERE";
system("clear");
15. Les tubes Anonymes
15
Communications unidirectionnels:
Exemple :
printf("_____________________________________________n");
printf("ttProcessus Courant:: %dn",(int)getpid());
printf("_____________________________________________n");
if (pipe(fd) == -1)
{
perror ("Creation du pipe a échoué ");
exit(1);
}
pid=fork();
if(!pid)
{
close(fd[0]);//fermeture du fichier de lecture par le fils
printf("tttttt+++++++++++++++++++++++++++++++++++++++e[mn");
printf("ttttttt e[29m Processus FILS:: %dn",(int)getpid());
printf("tttttt+++++++++++++++++++++++++++++++++++++++n");
printf("tttttt e[29mProcessus FILS::PERE JE T'ENVOIE UN MESSAGEn");
16. Les tubes Anonymes
16
Communications unidirectionnels:
Exemple :
if (write(fd[1],phrase,strlen(phrase)+1)== -1)
{
perror("write : Ecriture dans le pipe à échoué ");
exit(4);
}
close(fd[W]);//fermeture du fichier d'écriture par le fils
//sleep(2);
exit(3);
}
printf("%c[%d;%dm J'attends la terminaison du fils%c[%dmn",27,1,33,27,0);
wait(NULL);
close(fd[1]);//fermeture du fichier de lecture par le pere
17. Les tubes Anonymes
17
Communications unidirectionnels:
Exemple :
if (( Nboctects = read (fd[0],message, 100)) == -1)
{
perror ("read : Lecture échoué ");
exit(5);
}
message[Nboctects]='0';
printf("%c[%d;%dmMESSAGE RECU :: nboctets = %d Message=
%s%c[%dmn",27,1,33,Nboctects,message,27,0);
close(fd[R]);//fermeture du fichier d'écriture par le pere
return 0;
}
18. Les tubes Anonymes
18
Communications unidirectionnels:
Redirection des entrées standards et des sorties standards
La duplication de descripteur permet à un processus de créer
un nouveau descripteur (dans la table de descripteur )
synonyme d’un descripteur déjà existant.
#include<unistd.h>
int dup(int desc);
int dup2(int desc1, int desc2);
dup crée et retourne un descripteur synonyme à desc, le
numéro associé au descripteur crée est le plus petit
descripteur disponible dans la table des descripteurs des
fichiers du processus
dup2 transforme le desc2 à un descripteur synonyme au
descripteur desc1
19. Les tubes Anonymes
19
Communications unidirectionnels:
Redirection des entrées standards et des sorties standards
Les fonctions dup et dup2 permettent la redirection des
entrées sorties vers les tubes de communications.
who wc
20. Les tubes Anonymes
20
Communications unidirectionnels:
EXERCICE
On veut établir, en utilisant les tubes nommés, une
communication de type anneau unidirectionnel entre trois
processus fils. Pour ce faire, la sortie standard de l’un doit être
redirigée vers l’entrée standard d’un autre.