Unamed Pipes
Unamed Pipes
Unamed Pipes
UNIX
Chapitre 3 : La communication
interprocessus avec des tubes
Najar Yousra
Email : yousra.najar@isi.utm.tn
Descripteurs spéciaux
Les descripteurs de fichier 0, 1 et 2 sont spéciaux : ils
représentent respectivement l’entrée standard, la
sortie standard et la sortie d’erreur. Si le programme
est lancé depuis un terminal de commande sans
redirection, 0 est associé au clavier, 1 et 2 à l’écran.
Ces descripteurs sont définis de manière plus lisible
dans le fichier <unistd.h> :
Programmation Système sous UNIX
2 éme ing 80
Rappels sur les entrées / Sorties
Appel système open
L’appel système open() permet d’associer un descripteur de fichier à un fichier que
l’on souhaite manipuler. En cas de succès, le système d’exploitation va créer une
référence dans la table des fichiers et va indiquer l’entier correspondant. Une fois
référencé dans la table des fichiers, le fichier est dit « ouvert ». L’appel système
open() s’utilise de la manière suivante :
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *filename, int flags);
// Exemples:
open(”fifo”, O_RDONLY); // ouverture en lecture seule
open(”fifo”, O_WRONLY); // ouverture en écriture seule
open(”fifo”, O_RDONLY|O_NONBLOCK);
open(”fifo”, O_WRONLY|O_NONBLOCK);
L’appel système write() permet d’écrire des données dans un fichier représenté par
le descripteur de fichier fd. Il s’utilise de la même façon que l’appel système read().
La valeur retournée est le nombre d’octets effectivement écrits. En cas d’erreur, -1
est retourné.
Cet appel permet de fermer un fichier précédemment ouvert par l’appel système
open(), c’est-à-dire de supprimer la référence à ce fichier dans la table maintenue par
le système (table des fichiers ouverts).
Descripteurs de fichiers
ouverts
0 (entrée standard)
1 (sortie standard)
6 (écriture tube)
Programmation Système sous UNIX
2 éme ing 84
Les notions de base sur les tubes
I. La lecture d’un tuyau est bloquante, c’est-à-dire que si aucune donnée n’est
disponible en lecture, le processus essayant de lire le tuyau sera suspendu (il ne
sera pas pris en compte par l’ordonnanceur et n’occupera donc pas inutilement
le processeur) jusqu’à ce que des données soient disponibles. L’utilisation de
cette caractéristique comme effet de bord peut servir à synchroniser des
processus entre eux (les processus lecteurs étant synchronisés sur les processus
écrivains).
II. La lecture d’un tuyau est destructrice, c’est-à-dire que si plusieurs processus lisent le
même tuyau, toute donnée lue par l’un disparaît pour les autres. Par exemple, si un
processus écrit les deux caractères ab dans un tuyau lu par les processus A et B et
que A lit un caractère dans le tuyau, il lira le caractère a qui disparaîtra
immédiatement du tuyau sans que B puisse le lire. Si B lit alors un caractère dans le
tuyau, il lira donc le caractère b que A, à son tour, ne pourra plus y lire. Si l’on veut
donc envoyer des informations identiques à plusieurs processus, il est nécessaire de
créer un tuyau vers chacun d’eux.
III. De même qu’un tuyau en cuivre a une longueur finie, un tuyau de données à une
capacité finie. Un processus essayant d’écrire dansProgrammation
un tuyau Système
plein sous
se verra
UNIX suspendu
en attendant qu’un espace suffisant se libère 2 éme ing 85
Les tubes sans noms
Les tubes sans nom sont des liaisons unidirectionnelles de communication. La
taille maximale d’un tube sans nom varie d’une version à une autre d’Unix, mais
elle est approximativement égale à 5Ko. Les tubes sans nom peuvent être créés
par le shell ( | ) ou par l’appel système pipe().
RQ : L’accès au tube se fait via les descripteurs. Seul le processus créateur du tube
et ses descendants (ses fils) peuvent accéder au tube.
1 (sortie standard)
2 (sortie d’erreur )
RQ : L’accès au tube se fait via les descripteurs. Seul le processus créateur du tube
et ses descendants (ses fils) peuvent accéder au tube.
else
{
// Le père ferme le descripteur non utilisé d’ écriture
close(fd[W]) ;
// extraction du message du tube
nboctets = read (fd[R], message,100) ;
printf ( "Lecture %d octets : %s\n", nboctets , message) ;
// fermeture du descripteur de lecture
close ( fd[R ]) ;
}
return 0;
}
Programmation Système sous UNIX
2 éme ing 92
Les tubes sans noms
Redirection de sortie et d’entrée standards
Une technique couramment employée avec les tuyaux est de relier la sortie
standard d’une commande à l’entrée standard d’une autre, comme quand on tape (
who | wc ). Les appels système utilisés sont dup et dup2.
ls | wc
Processus Processus
écrivain lecteur