Pipes et FIFO

Guillaume Chanel

Remerciements à Jean-Luc Falcone

Rappel sur les pipes et FIFO

Rappel:

$ ls -lh /dev | more
  • Le noyau crée un canal de communication anonyme (pipe en anglais, tube en français) entre les processus ls et more
  • Il est également possible de créer des tubes nommées (named pipes ou FIFO).

Tubes anonymes

On peut créer un canal de communication anonyme en utilisant:

int pipe(int fildes[2]);
  • filedes[0] est un descripteur de fichier représentant la sortie du tube/pipe (i.e. on peu lire sur ce descripteur);
  • filedes[1] est un descripteur de fichier représentant l'entrée du tube/pipe (i.e. on peu écrire sur ce descripteur);
  • retourne -1 en cas d'erreur (voir errno);
  • Pas d'accès aléatoire possible.

Concepts generaux des pipes

Les tubes et FIFO:

  • Permettent une communication à haute vitesse entre deux processus sur la même machine.
  • Ont deux extrémités: une ouverte en lecture et une ouverte en écriture.
  • Sont unidirectionels: en conséquence du point précédent l'information ne transite que dans un sens.

  • Sont bloquants:
    • L'ouverture d'une extrémité bloque jusqu'à l'ouverture de l'autre extrémité.
    • Permet d'établir des Rendez-Vous
    • Possibilité de deadlocks !

Pipe nommé: Commande mkfifo(1)

On peut créer un FIFO avec la commande:

mkfifo [OPTION]... NOM...
  • NOM est le nom du FIFO à créer
  • Parmi les options on peut passer les permissions du FIFO par l'option -m MODE.
Exemple shell

                        $ mkfifo -m 0640 /tmp/fifo1
                        $ ls -lh /dev > /tmp/fifo1

                        $ more /tmp/fifo1  # Dans un autre shell
                    

Fonction POSIX mkfifo(2)

On peut créer un FIFO avec l'appel système:

int mkfifo(const char *pathname, mode_t mode);
  • pathname est le nom du fichier à créer
  • mode représente les permissions (modifiées mode & ~umask)
  • Un FIFO peut être ouvert en lecture/écriture comme n'importe quel fichier (open/read) mais il faut veiller à respecter la directionalité du fifo
  • Pas d'accès aléatoire possible.

Exemple - producer

Include example there (see script)

Exemple - consumer

Include example there (see script)