Академический Документы
Профессиональный Документы
Культура Документы
2me anne
IUT de Caen, Dpartement dInformatique
(Franois Bourdon)
Franois Bourdon
Chapitre 5
Echange de donnes entre Processus :
les Tubes et les Verrous
Franois Bourdon
Plan
1.Systme de Gestion des Fichiers : Concepts
avancs
2.Cration et ordonnancement de Processus
3.Synchronisation de Processus
4.Communication entre Processus : les Signaux
5.Echange de donnes entre Processus.
5.1 Les tubes
5.2 Les verrous
6.Communication entre Processus : les IPC
Franois Bourdon
bloque
(ventuellement)
le
processus
Franois Bourdon
Franois Bourdon
lectures
Franois Bourdon
le
comportement
de
la
Franois Bourdon
Franois Bourdon
p[0]
write
read
nombre de
liens internes
(lecteur
crivain)
p[0]
inoeud
associ
au tube
p[1]
1 rd
table des
descripteurs
du processus
appelant
1 wr
table des fichiers
ouverts
2 0
.......
Franois Bourdon
Franois Bourdon
La duplication de descripteur
La duplication de descripteur permet un
processus dacqurir un nouveau descripteur
(dans sa table des descripteurs) synonyme dun
descripteur dj existant.
Ce mcanisme est principalement utilis pour raliser
des redirections des trois fichiers dentresorties standard.
Il repose sur le fait que le descripteur synonyme
renvoy est toujours le plus petit descripteur disponible,
dans la table des descripteurs du processus demandeur,
qui satisfait une condition particulire.
La
duplication
associe
donc
un
descripteur
Franois Bourdon
La primitive
#include <unistd.h>
int dup (int desc);
associe le plus petit descripteur disponible du
processus appelant, la mme entre dans la table des
descripteurs ouverts que desc.
En cas de russite, la valeur retourne est le
descripteur synonyme.
Si lon veut rediriger la sortie standard (descripteur
"1") du processus courant vers le tube (tube[1]) dont il a
accs, il suffit de fermer cette sortie (close (1)), puis de
faire une duplication de la sortie en criture dans le tube :
"dup(tube[1])".
Ensuite il ne restera plus qu fermer le descripteur
"tube[1]" devenu inutile.
Enfin les critures standard (fwrite, printf, ...) iront
crire directement dans le tube.
Franois Bourdon
Franois Bourdon
Franois Bourdon
/* processus 2 */
int d_lecture, d_ecriture;
...
decriture=open("fifo2", O_WRONLY);
d_lecture=open("fifo1", O_RDONLY);
write
read
fifo1
Processus 1
Processus 2
read
write
fifo2
Franois Bourdon
$ mkfifo fifo
$ cat >fifo
abcd
efgh
$ cat <fifo
CTRL D
abcd
efgh
$
Franois Bourdon
Client
struct rponse
fifo2
Franois Bourdon
Franois Bourdon
(advisory),
soit
le
mode
impratif
(mandatory).
Dans le mode consultatif un verrou na pas
dinfluence sur le comportement des autres primitives
dentressorties (open/read/write).
En mode impratif, un verrou peut empcher la
ralisation dune opration de lecture ou dcriture :
un verrou partag utilis dans ce mode, tout
autre processus faisant une criture dans la
porte de ce verrou est bloqu ;
un verrou exclusif utilis dans ce mode, tout
autre processus faisant une lecture ou une
criture dans la porte de ce verrou est bloqu.
Franois Bourdon
P1
P2
P2
demande
conduisant
un deadlock
P1
demande bloque
Franois Bourdon
Franois Bourdon
(dverrouille
la
section
verrouille),
F_TLOCK (verrouille une section),
F_LOCK
Franois Bourdon
Franois Bourdon
/* valeurs possibles :
appartient le verrou */
};
F_RDLCK : type partag
F_WRLCK : type exclusif
F_UNLCK : relchement de la zone rserve
SEEK_SET : dbut du fichier
SEEK_CUR : position courante de loffset
SEEK_END : fin du fichier
Lintervalle verrouill commence "l_whence + l_start".
Cours Systme dExploitation IUT de Caen
Franois Bourdon
La manipulation :
struct flock verrou;
int rep,desc,commande;
...
rep = fcntl (desc, commande, &verrou);
...
o fcntl est une fonction qui permet en fonction du
paramtre "commande" la ralisation dun certain nombre
doprations diffrents niveaux dans les tables du
systme.
En utilisant la commande F_SETLK ou
F_SETLKW
fcntl
pose
un
verrou
Franois Bourdon
Exemple :
$ cat verrou.c
#include <unistd.h>
#include <fcntl.h>
main() {
int desc;
struct flock verrou;
if((desc=open("f",O_RDWR))==1){
perror("open");
exit(0);}
/* verrou exclusif sur le 15eme caractere de "f" */
verrou.l_type=F_WRLCK; // exclusif
verrou.l_whence=SEEK_SET; // dbut du fichier
verrou.l_len=1;
verrou.l_start=15;
/* pose bloquante */
if(fcntl(desc, F_SETLKW, &verrou)==1){
perror("pose verrou");
exit(0);}
printf("Verrou pose par %d\n",getpid());
sleep(30);
printf("Fin du processus %d\n", getpid());
}
$
Franois Bourdon
$ cat lire.c
#include <fcntl.h>
main() {
int desc, nb_lu;
static char ch[10];
desc = open ("f", 0_RDWR);
nb_lu = read (desc, ch, 9);
printf ("read1: %d caracteres lus %s\n", nb_lu, ch);
nb_lu = read (desc, ch, 9);
printf ("read2: %d caracteres lus %s\n", nb_lu, ch);
}
$ ls l f
rwrr
$ cat f
0123456789abcdefghijklmnop
$
Franois Bourdon
$ verrou& verrou&
[1] 879
[2] 880
le processus 880
est bloqu sur
la pose de son
verrou par celui
pos par le 879
0123456789abcdefghijklmnop
$ Fin du processus 879
Verrou pose par 880
ceci libre le
processus 880
$ verrou& lire
Verrou pose par 885
[1] 885
read1: 9 caracteres lus > 012345678
Fin du processus 885
Franois Bourdon