Dans cette page de La conception et la mise en œuvre du système d'exploitation 4.4BSD , il est dit que:
Une différence majeure entre les tuyaux et les sockets est que les tuyaux nécessitent un processus parent commun pour configurer le canal de communication
Cependant, si j'enregistre correctement, la seule façon de créer un nouveau processus est de fork
l'exécuter. Je ne peux donc pas vraiment voir comment 2 processus ne pouvaient pas avoir un ancêtre commun. Ai-je alors raison de penser que n'importe quelle paire de processus peut être canalisée?
ps auxf
une idée sur les ancêtres du processus.Réponses:
Pas vraiment.
Les tuyaux doivent être configurés par le processus parent avant que l'enfant ou les enfants ne soient bifurqués. Une fois que le processus enfant est bifurqué, ses descripteurs de fichiers ne peuvent pas être manipulés "de l'extérieur" (en ignorant des choses comme les débogueurs), le parent (ou tout autre processus) ne peut pas faire la partie "configurer le canal de communication" après le fait .
Donc, si vous prenez deux processus aléatoires qui sont déjà en cours d'exécution, vous ne pouvez pas configurer directement un canal entre eux. Vous devez utiliser une certaine forme de socket (ou un autre mécanisme IPC) pour les faire communiquer. (Mais notez que certains systèmes d'exploitation, parmi lesquels FreeBSD, vous permettent d'envoyer des descripteurs de fichiers sur des sockets de domaine Unix.)
la source
Cette phrase n'est pas très claire. Tout d'abord, le parent doit être un ancêtre , car le processus de configuration du canal peut être un parent, ou un grand-parent, ou un grand-grand-… grand-parent, ou l'un des processus de communication. Deuxièmement, la phrase ne signifie pas «si vous voulez un tuyau, il doit exister un processus ancêtre commun», mais «si vous voulez un tuyau, un processus ancêtre commun doit le configurer».
Sous le capot, un processus établit un tuyau avec lui-même. Le canal est un descripteur de fichier comme les autres, ou plus précisément une paire de descripteurs de fichiers, un pour chaque extrémité. Le processus qui a créé le canal peut l'utiliser immédiatement pour envoyer des données à lui-même, bien que cela soit rarement utile (même si un canal automatique a son utilité).
Un idiome typique est pour un processus de configurer un tuyau, puis de bifurquer un processus enfant et de fermer une extrémité du tuyau dans le parent et l'autre extrémité du tuyau dans l'enfant. Cela permet au processus parent et enfant de communiquer dans une seule direction. Si les processus nécessitent une communication bidirectionnelle, ils ont besoin de deux canaux (sauf sur certaines variantes Unix où les canaux sont bidirectionnels).
Les canaux sont hérités à leur tour par tous les enfants, de sorte que le processus qui a créé le canal peut ne pas être impliqué dans la communication. Par exemple, un tuyau dans un shell créé entre deux commandes externes, comme
ls | rot13
implique les étapes suivantes:execve
surls
.execve
àrot13
.Si deux processus existants souhaitent communiquer entre eux, ils peuvent utiliser un canal nommé . (Eh bien, il y a aussi un descripteur de fichier qui passe , mais ce n'est pas pour les faibles de cœur.)
la source
L'enveloppe du pipeline est le parent commun qui établit un canal de communication entre les différents membres du pipeline.
Tout processus peut être canalisé vers n'importe quel autre. Les seuls processus qui peuvent être utilement regroupés sont des "filtres" qui lisent depuis stdin et écrivent vers stdout.
Par exemple, si vous exécutez la commande
ps -eaH
montrera que le chat et ses deux queues sont des enfants de la coquille invocatrice:la source