Mkfifo

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Fichiers spéciaux / IPC
Commande mkfifo
Contexte Créer un tube nommé (named pipe / FIFO) dans le système de fichiers
Voir aussi mknod, SIGPIPE

mkfifo crée un tube nommé (FIFO, First In First Out), un fichier spécial qui se comporte comme un pipe classique mais reste accessible via un chemin dans le système de fichiers. Contrairement à un fichier normal, il ne contient aucune donnée sur le disque : il sert uniquement de point de rendez-vous entre un processus qui écrit et un processus qui lit. C'est un moyen simple de faire communiquer deux processus (ou deux sessions) sans passer par un pipe anonyme (|) ni par un fichier temporaire classique.

Créer un tube nommé

mkfifo /tmp/mon_tube

Le fichier apparaît dans ls -l avec le type p (première colonne) et une taille de 0, puisqu'il n'a pas de contenu propre.

Fonctionnement

  • Tant qu'aucun lecteur n'a ouvert le tube, un processus qui tente d'écrire dedans reste bloqué (ou reçoit SIGPIPE si personne ne l'ouvrira jamais côté lecture).
  • Une fois le dernier lecteur parti, un nouveau write() sur le tube envoie SIGPIPE à l'écrivain.
  • Le tube peut être réutilisé indéfiniment (contrairement à un fichier one-shot) : plusieurs cycles écriture/lecture peuvent s'enchaîner tant que le fichier existe.

Exemple : partager une session shell en direct

Cas d'usage classique : montrer en lecture seule à un autre utilisateur (ou à un autre terminal) tout ce qui se tape dans une session shell, sans utiliser screen ni tmux.

# Terminal A : créer le tube et démarrer l'enregistrement de la session dedans
mkfifo /tmp/sortie_script
script -f /tmp/sortie_script
# "Script started, file is /tmp/sortie_script"
# Terminal B (ou un autre utilisateur) : lire ce qui s'affiche en direct
cat /tmp/sortie_script

L'option -f de script force un flush après chaque écriture, ce qui rend la lecture vraiment "en direct". Tant que personne n'a lancé le cat côté lecture, l'écriture dans le tube reste bloquée — c'est normal, c'est le comportement attendu d'une FIFO. Pour arrêter l'enregistrement côté terminal A, un Ctrl-D suffit.

Exemple : dédupliquer une sortie vers plusieurs consommateurs

Un tube nommé permet aussi de faire consommer le même flux par plusieurs commandes sans recalculer la sortie ni écrire de fichier intermédiaire sur disque :

mkfifo /tmp/flux
grep erreur /tmp/flux > erreurs.log &
generateur_de_logs > /tmp/flux

Nettoyage

Un tube nommé reste sur le disque tant qu'il n'est pas supprimé explicitement : rm /tmp/mon_tube une fois l'usage terminé.

Voir aussi

  • mknod — commande plus bas niveau permettant aussi de créer des fichiers spéciaux (FIFO, périphériques bloc/caractère)