Mkfifo
| 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
SIGPIPEsi personne ne l'ouvrira jamais côté lecture). - Une fois le dernier lecteur parti, un nouveau
write()sur le tube envoieSIGPIPEà 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)