Tubes anonymes :
Destins aux
processus dun
mme groupe
Tubes nomms :
Destins des
processus
nappartenant
pas un mme
groupe
File de messages :
Permettent de transmettre des donnes structures entre processus
appartenant ou non un mme groupe
Sockets:
Communication entre processus sexcutant sur des machines diffrentes
dans un rseau, selon un schma client / serveur.
I.
Lecture
criture
ABC 23Y
Les descripteurs peuvent tre aussi acquis par hritage : un processus fils hrite
de son pre des descripteurs de tube, entre autres.
La cration dun tube se fait laide de la primitive pipe :
# include <unistd.h>
int pipe (int p[2]) ;
Qui retourne dans le tableau p pass en paramtre les descripteurs utiliser
pour accder au tub.
p[0] : pour la lecture
p[1] : pour lcriture
Elle retourne -1 en cas derreur.
La lecture dans un tube se fait gce la primitive read dont la syntaxe est
int read(int p[0], void *buf, int nb_car) ;
nb_car: le nombre de caractres que lon souhaite lire partir du tube.
buf : un pointeur sur une zone mmoire dans laquelle ils seront rangs aprs
lecture.
Cette primitive retourne le nombre de caractre effectivement lus.
Remarque (lecture bloquante).
Un processus qui tente de lire dans un tube vide et pour lequel il existe des
processus rdacteurs (processus qui dtiennent le descripteur dcriture dans ce
tube), est bloqu jusqu ce que le tube ne soit plus vide.
Exemple :
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#define BUFFER_SIZE 256
int main(void)
{pid_t pid_fils;
int tube[2];
unsigned char bufferR[256], bufferW[256];
puts(creation dun tube);
if (pipe(tube) !=0) {
fprintf(stderr, erreur dans pipe\n);
exit(1) ;
}
Pid_fils =fork();
If (pid_fils == -1)
{ fprintf(stderr, erreur dans pipe\n);
exit(1) ;}
if (pid_fils == 0)
/*processus fils*/
{
printf(fermeture entre dans le fils (pid = %d)\n, getpid()) ;
close(tube[1]) ;
read(tube[0], bufferR, BUFFER_SIZE) ;
printf (le fils (%d) a lu : %s\n, getpid(), bufferR);
}
else
{
printf (fermeture sortie dans le pre (pid=%d)\n,getpid());
close(tube[0]) ;
sprintf(bufferW, Message du pre (%d) au fils, getpid()) ;
write(tube[1], bufferW, BUFFER_SIZE);
wait(NULL);
}
return 0 ;
}
N.B
Les fonctions read et write permettent de transmettre uniquement des
tableaux doctets. Toute donne (nombre ou texte) doit tre convertie en
tableau de caractres pour tre transmise, et la taille de ces donnes doit
tre connue dans les deux processus communicants.
Exercice ( remettre la semaine prochaine)
$ mknod nom_tube p
Droits daccs
Chemin daccs.
Processus1
Int d_lect, d_ecrit ;
Processus2
Int d_lect, d_ecrit ;