Puis-je diriger deux processus l'un vers l'autre?


8

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 forkl'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?


1
Si votre question concerne vraiment un «ancêtre commun», ce n'est pas ce que dit votre citation. Un parent est un ancêtre, mais tous les ancêtres ne sont pas parents.
msw

jetez un œil à ps auxfune idée sur les ancêtres du processus.
michas

@msw voulez-vous dire que les 2 processus doivent avoir le même parent direct? être cousin (c'est-à-dire avoir un grand-parent commun) ne suffit pas?
qdii

Réponses:


7

Ai-je alors raison de penser que n'importe quelle paire de processus peut être canalisée?

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.)


4

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 | rot13implique les étapes suivantes:

  • La coque crée un tuyau.
  • Le shell accélère un processus. L'enfant ferme l'extrémité lecture du tube et des appels execvesur ls.
  • Le shell accélère un processus. L'enfant ferme l'extrémité d'écriture du tube et appelle execveà rot13.
  • L'enveloppe ferme les deux extrémités du tuyau et attend la sortie des deux sous-processus.

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.)


2

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

$ tail -f /etc/motd | tail -f | cat > /dev/null

ps -eaH montrera que le chat et ses deux queues sont des enfants de la coquille invocatrice:

 1675 pts/0    00:00:00     bash
 2483 pts/0    00:00:00       tail
 2484 pts/0    00:00:00       tail
 2485 pts/0    00:00:00       cat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.