Substitution de processus
En informatique, la substitution de processus est une forme de communication inter-processus permettant à l'entrée ou à la sortie d'une commande d’apparaître sous la forme d'un fichier. L'interface système substitue la commande en ligne par un nom d'un fichier. Cela permet aux programmes qui n'acceptent normalement que des fichiers de lire directement à partir ou vers un autre programme.
Exemple
[modifier | modifier le code]Les exemples suivants utilisent la syntaxe Bash.
La commande diff de Unix accepte normalement les noms de deux fichiers à comparer, ou un nom de fichier et l'entrée standard. La substitution de processus vous permet de comparer directement la sortie de deux programmes :
$ diff <(sort fichier1) <(sort fichier2)
L'expression <(commande)
dit à l'interpréteur d'exécuter commande et fait apparaitre sa sortie sous la forme d'un fichier. La commande peut être n'importe quelle commande complexe de l'interface système.
Sans la substitution, les alternatives sont:
1. Sauvegarder la sortie de la commande(s) vers un fichier temporaire, puis lire le(s) fichier(s) temporaire(s).
$ sort fichier2 > /tmp/fichier2.trie
$ sort fichier1 | diff - /tmp/fichier2.trie
$ rm /tmp/fichier2.trie
2. Créer un tube nommé (aussi connu sous le nom de FIFO), démarrez une commande écrivant vers le tube nommé en tâche de fond, puis exécutez l'autre commande avec le tube nommé en tant qu'entrée.
$ mkfifo /tmp/tri2.fifo
$ sort fichier2 > /tmp/tri2.fifo &
$ sort fichier1 | diff - /tmp/tri2.fifo
$ rm /tmp/tri2.fifo
Les deux possibilités sont plus lourdes.
La substitution de processus peut aussi être utilisée pour capturer la sortie qui est normalement destinée à aller vers un fichier, et la rediriger vers l'entrée d'un processus. La syntaxe Bash pour écrire vers un processus est >(commande)
. Voici un exemple utilisant les commandes tee
, wc
et gzip
pour compter les lignes d'un fichier avec wc -l
et les compresser avec gzip
en une seule passe:
$ tee >(wc -l >&2) < grosfichier | gzip > grosfichier.gz
Avantages
[modifier | modifier le code]Les avantages principaux de la substitution de processus sur ses alternatives sont :
- sa simplicité : les commandes peuvent être saisies en ligne, il n'y a pas besoin avant cela de sauvegarder des fichiers temporaires ou créer des tubes nommés ;
- sa performance : lire directement d'un autre processus est souvent plus rapide que de devoir écrire dans un fichier temporaire sur disque, puis de le lire. Cela permet aussi d'économiser de l'espace disque ;
- son parallélisme : le processus substitué peut s'exécuter concurrentiellement avec la commande lisant sa sortie ou écrivant sur son entrée, tirant avantage du traitement multiple pour réduire le temps total de traitement.
Mécanisme
[modifier | modifier le code]Sous le capot, la substitution de processus fonctionne en créant un tube nommé, puis en substituant son nom sur la ligne de commande (la substitution de processus est ainsi parfois appelée "tube nommé anonyme"). Pour illustrer les étapes en jeu, considérez la substitution simple de commande suivante :
diff fichier1 <(sort fichier2)
Les étapes entreprises par l'interface système sont:
- Création d'un nouveau tube nommé. Ce fichier spécial est souvent nommé sur le modèle
/dev/fd/63
sur les systèmes de style Unix; vous pouvez le voir avec une commande commeecho <(true)
. - Exécution de la commande substituée en arrière-plan (
sort fichier2
dans notre cas), tubant sa sortie sur le tube nommé. - Exécution de la commande primaire, en remplaçant la commande substituée par le nom du tube nommé. Dans notre cas, la commande entière peut se développer en
diff fichier1 /dev/fd/63
. - Quand l'exécution est terminée, suppression du tube nommé.
Limitations
[modifier | modifier le code]La substitution de processus a quelques limitations : les « fichiers » créés ne peuvent pas être recherchés (fseek), ce qui veut dire que le processus lisant depuis ou écrivant vers le fichier ne peut pas réaliser un accès direct ; il doit seulement lire ou écrire du début à la fin. Les programmes qui vérifient explicitement le type de fichier avant de l'ouvrir pourrait refuser de fonctionner avec la substitution de processus, car le « fichier » résultant de la substitution de processus n'est pas un fichier normal. « Il n'est pas possible d'obtenir un code de sortie d'une commande de substitution de processus à partir de l’interface système ayant créé la substitution de processus. »[1]
Voir aussi
[modifier | modifier le code]Références
[modifier | modifier le code]- « Bash Reference Manual », The GNU Project, Free Software Foundation, (consulté le )
- Mendel Cooper, « Advanced Bash-Scripting Guide », The Linux Documentation Project, (consulté le )
- Mitch Frazier, « Bash Process Substitution », Linux Journal, (consulté le )
- « ProcessSubstitution », Greg's Wiki,
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Process substitution » (voir la liste des auteurs).