Vous êtes sur la page 1sur 4

3.

Tubes nomms ou FIFO


3.1. Principe du client-serveur
Dans une base de donne classique, diffrents processus peuvent accder en consultation ou
en modification aux mmes fichiers en mme temps. Il en rsulte un ventuel problme de
conflits et dintgrit des donnes.
Dans une application client-serveur, il y a un processus charg de consulter ou modifier les
donnes (le serveur), les autres processus (les clients) adressant des demandes (de
consultation ou de modification) au serveur. Il ny a pas de conflits daccs aux donnes car
un seul programme (le serveur) peut consulter ou modifier les donnes.

Bote lettres
Client 1
Serveur
Client 2

La zone servant dinterface pour les requtes et les rponses est une sorte de bote aux lettres
o on dpose les requtes (les commandes) et o on rcupre les rponses.
La bote aux lettres peut tre ralise sous Unix de diffrentes faons : tubes nomms, files
de messages, mmoires partages et smaphores.

3.2. Principe des tubes nomms ou FIFO


Cest un tube qui a un nom dans le systme de fichiers. Tout processus peut louvrir,
condition den connatre le nom et den avoir les droits daccs. Un processus ayant ouvert
un tube en criture est suspendu tout pendant quil nexiste pas de processus lecteur.
Les processus nont pas forcment de lien de parent (comme cest le cas des tubes
anonymes). Dans les deux cas, le tube est une zone de donnes dans la mmoire centrale.
Au niveau du shell :
mkfifo permet de crer un tube nomm dans le systme de fichiers.
$ mkfifo tubenom
$ echo bonjour > tubenom

Le processus est suspendu tant quil ny a pas de


processus lecteur dans le tube

$ cat < tubenom


$ bonjour

On a cre un lecteur dune autre fentre

Au niveau des appels systme :


mknod() est un appel systme qui cre un fichier ou un rpertoire. Loption S_IFIFO indique
la cration dun tube nomm.
mknod (nom, S_IFIFO | 0666, 0)
Prof. C.EL AMRANI

Chapitre 3. Tubes nomms ou FIFO

mkfifo() est une fonction faisant appel mknod :


mkfifo(nom, 0666) ;
/* nom comme argv[1] */

3.3. Exemple de communication par tube nomm


Le programme fifo1.c cre un tube nomm dont le nom est donn en paramtre, louvre en
criture, redirige sa sortie standard vers ce tube et excute le filtre majuscul.
A lexcution, le processus crivain reste suspendu, car il ny a pas de processus lecteur
pour ce tube.
fifo1.c
#include<stdio.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<unistd.h>
main(int argc, char * argv[])
{
int p;
int R;
if (argc!=2){printf("introduire un nom de fichier\n");exit(1);}
R=mknod(argv[1], S_IFIFO | 0666, 0);
if(R==-1 && errno!=EEXIST)
{perror("Pb de creation du tube nomme");exit(2);}
if((p=open(argv[1],O_WRONLY,0))==-1)
{perror("ouverture impossible du tube");exit(2);}
dup2(p,1);
execlp("./majuscul","./majuscul",NULL);
perror("Pb execlp");
exit(1);
}
Excution :
./fifo1 tubenom < bonjour.txt
Le programme fifo2.c ouvre le tube nomm en lecture, redirige son entre standard vers le
tube et excute le filtre par.
fifo2.c
#include<stdio.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>

Prof. C.EL AMRANI

Chapitre 3. Tubes nomms ou FIFO

#include<unistd.h>
main(int argc, char * argv[])
{
int p;
if (argc!=2){printf("introduire un nom de fichier\n");exit(1);}
if((p=open(argv[1],O_RDONLY,0))==-1)
{perror("ouverture impossible du tube");exit(2);}
dup2(p,0);
execlp("./par","./par","4",NULL);
perror("Pb execlp");
exit(1);
}
Excution :
./fifo2 tubenom
BONJ
OUR
MONS
IEUR
Le lancement du processus fifo2 rveille le processus fifo1 suspendu.

3.4. Client-serveur avec des tubes nomms


La gestion dune application client-serveur peut se faire en utilisant des tubes nomms
comme moyen de communication interprocessus. Un tube connu des clients reoit les
requtes. Le serveur fournit la rponse en crant un tube pour chaque client. Les processus
client et serveurs sont indpendants mais communiquent par des tubes nomms. Le serveur
est constamment en attente de messages dans son tube nomm.
Il y a autant de tubes nomms pour les rponses que de clients. Quand un client se termine,
son tube nomm est dtruit.
Lenvoi dun message client consiste en une criture dans le tube nomm du serveur. La
rception dun message client consiste en la lecture dans le tube nomm du client.

Bote lettres
not911
write
Prof. C.EL AMRANI

read

Chapitre 3. Tubes nomms ou FIFO

read

snot1000

write

Client1

Serveur
notes.dat

write

not725

write
read

Dtails dun client-serveur avec des tubes nomms


911 et 725 (par exemple) sont les N PID des processus Client1 et Client2.

Prof. C.EL AMRANI

Client2

Vous aimerez peut-être aussi