Académique Documents
Professionnel Documents
Culture Documents
➢ Les tubes anonymes sont un moyen simple de communication entre deux processus
apparentés, c'est-à-dire ayant un processus parent commun.
➢ Ils sont créés par l'appel système pipe(), qui renvoie deux descripteurs de fichier,
l'un pour la lecture, l'autre pour l'écriture.
Descripteur de fichier
Un descripteur de fichier (fd) est un petit nombre entier non négatif utilisé par le noyau
pour référencer un fichier utilisé par un programme en cours d'exécution. C’est est un
entier qui représente un fichier ouvert dans le système d'exploitation. Il est utilisé
pour accéder au fichier, par exemple pour lire ou écrire des données.
Les descripteurs de tubes sont des descripteurs de fichier spéciaux qui représentent
un tube :
➢ Les tubes sont unidirectionnels, c'est-à-dire qu'un processus ne peut écrire que
dans un tube et lire que dans un autre.
Pour utiliser un tube, un processus doit ouvrir les deux descripteurs de fichier renvoyés
par l'appel système pipe(). Le processus qui écrit dans le tube utilise le descripteur
d'écriture pour écrire les données dans le tube. Le processus qui lit dans le tube utilise
le descripteur de lecture pour lire les données du tube.
Exemple d'utilisation d'un tube
Le code suivant illustre l'utilisation d'un tube pour communiquer entre deux processus
:
C
#include <stdio.h>
#include <unistd.h>
int main() {
int fd[2]; tableau de 2 fd
char buf[1024]; // tableau de 1024 char
// Création du tube
pipe(fd);
// Processus producteur
if (fork() == 0) {
// Écriture dans le tube
write(fd[1], "Bonjour, mon fils !", strlen("Bonjour, mon fils !"));
exit(0);
}
// Processus consommateur
// Lecture dans le tube
read(fd[0], buf, 1024);
printf("Lecture : %s\n", buf);
Ce code crée un tube et le partage entre deux processus. Le processus producteur écrit
" Bonjour, mon fils !" dans le tube. Le processus consommateur lit " Bonjour, mon fils
!" du tube.
2. Les tubes nommés
2.1. Définition
➢ Les tubes nommés sont un type de tube qui est accessible à tous les processus
ayant les droits d'accès adéquats.
➢ Ils sont créés par l'appel système mkfifo().
➢ Les tubes nommés sont bidirectionnels, c'est-à-dire qu'un processus peut écrire
et lire dans le même tube.
Pour utiliser un tube nommé, un processus doit ouvrir le tube en lecture ou en écriture.
Le code suivant illustre l'utilisation d'un tube nommé pour communiquer entre deux
processus :
C
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
int main() {
int fd;
char buf[1024];
// Processus producteur
if (fork() == 0) {
// Écriture dans le tube nommé
fd = open("my_pipe", O_WRONLY); // O_WRONLY: flag d’ouverture
write(fd, " Bonjour, bon cours !", strlen("Bonjour, bon cours !"));
close(fd);
exit(0);
}
// Processus consommateur
// Lecture dans le tube nommé
fd = open("my_pipe", O_RDONLY);
read(fd, buf, 1024);
printf("Lecture : %s\n", buf);
close(fd);
return 0;
}
3. Conclusion
Les tubes et les descripteurs sont des mécanismes de communication puissants qui
peuvent être utilisés pour connecter différents processus.
Les valeurs possibles pour les flags d'ouverture sont les suivantes :
• O_RDONLY : Ouvre le fichier en mode lecture uniquement.
• O_WRONLY : Ouvre le fichier en mode écriture uniquement.
• O_RDWR : Ouvre le fichier en mode lecture et écriture.
• O_APPEND : Ajoute les données écrites au fichier à la fin du fichier.
• O_CREAT : Crée le fichier s'il n'existe pas.
• O_TRUNC : Supprime le contenu du fichier s'il existe.
• O_EXCL : Renvoie une erreur si le fichier existe déjà.
4. EXERCICES
Exercice 1
Écrivez un programme C qui crée deux processus, un processus émetteur et un processus récepteur.
Le processus émetteur écrit la chaîne "Hello, world!" dans le tube et le processus récepteur lit la
chaîne du tube et l'affiche sur la console.
Solution exo1
C
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
// Créer un tube
int pipefd[2];
pipe(pipefd);
Exercice 3
Écrivez un programme C qui crée deux processus, un processus émetteur et un processus
récepteur. Le processus émetteur écrit des chaînes dans le tube et le processus récepteur lit les
chaînes du tube et les affiche sur la console. Le processus récepteur doit afficher les chaînes
dans l'ordre inverse de celui dans lequel elles ont été écrites.