Posso collegare tra loro due processi?


8

In questa pagina da The Design and Implementation of the 4.4BSD Operating System , si dice che:

Una grande differenza tra pipe e socket è che le pipe richiedono un processo genitore comune per impostare il canale di comunicazione

Tuttavia, se registro correttamente, l'unico modo per creare un nuovo processo è quello forkesistente. Quindi non riesco davvero a vedere come 2 processi non possano avere un antenato comune. Ho quindi ragione a pensare che una coppia di processi possa essere collegata tra loro?


1
Se la tua domanda riguarda davvero un "antenato comune" non è quello che dice la tua citazione. Un genitore è un antenato, ma non tutti gli antenati sono genitori.
msw,

Dai un'occhiata a ps auxfun'idea sugli antenati del processo.
michas,

@msw vuoi dire che i 2 processi devono avere lo stesso genitore diretto? essere cugino (cioè avere un nonno comune) non è abbastanza?
qdii,

Risposte:


7

Ho quindi ragione a pensare che una coppia di processi possa essere collegata tra loro?

Non proprio.

Le pipe devono essere impostate dal processo padre prima che il bambino o i bambini vengano biforcati. Una volta che il processo figlio viene biforcato, i descrittori dei file non possono essere manipolati "dall'esterno" (ignorando cose come i debugger), il genitore (o qualsiasi altro processo) non può eseguire la parte "imposta il canale di comunicazione" dopo il fatto .

Quindi, se si prendono due processi casuali che sono già in esecuzione, non è possibile impostare direttamente una pipe tra di loro. È necessario utilizzare una qualche forma di socket (o un altro meccanismo IPC) per farli comunicare. (Nota che alcuni sistemi operativi, tra cui FreeBSD, ti consentono di inviare descrittori di file su socket di dominio Unix.)


4

Quella frase non è molto chiara. In primo luogo, il genitore dovrebbe essere un antenato , poiché il processo di installazione della pipe può essere un genitore, o un nonno, o un nonno-... -grandparent o uno dei processi di comunicazione. In secondo luogo, la frase non significa "se si desidera una pipe, deve esistere un processo antenato comune", ma "se si desidera una pipe, un processo antenato comune deve impostarlo".

Sotto il cofano, un processo stabilisce un tubo con se stesso. La pipe è un descrittore di file come un altro, o più precisamente una coppia di descrittori di file, uno per ciascuna estremità. Il processo che ha creato la pipe può usarlo immediatamente per inviare dati a se stesso, sebbene ciò sia raramente utile (sebbene una self-pipe abbia il suo uso).

Un tipico idioma è che un processo installi una pipe, quindi diagli un processo figlio e chiuda un'estremità della pipe nel genitore e l'altra estremità della pipe nel figlio. Ciò consente al genitore e al processo figlio di comunicare in una direzione. Se i processi necessitano di comunicazione bidirezionale, hanno bisogno di due pipe (ad eccezione di alcune varianti unix in cui le pipe sono bidirezionali).

Le pipe vengono ereditate a turno da tutti i bambini, quindi il processo che ha creato la pipe potrebbe non essere coinvolto nella comunicazione. Ad esempio, una pipe in una shell creata tra due comandi esterni come ls | rot13comporta i seguenti passaggi:

  • La shell crea una pipe.
  • La shell avvia un processo. Il bambino chiude l'estremità di lettura del tubo e chiamate execvesu ls.
  • La shell avvia un processo. Il bambino chiude l'estremità di scrittura del tubo e chiede execvesu rot13.
  • La shell chiude entrambe le estremità del tubo e attende l'uscita di entrambi i sottoprocessi.

Se due processi esistenti desiderano comunicare tra loro, possono utilizzare una pipa denominata . (Bene, c'è anche un descrittore di file che passa , ma non è per i deboli di cuore.)


2

La shell della pipeline è il genitore comune che imposta un canale di comunicazione tra i vari membri della pipeline.

Qualsiasi processo può essere collegato a qualsiasi altro. Gli unici processi che possono essere utilmente collegati tra loro sono "filtri" che leggono da stdin e scrivono su stdout.

Ad esempio, se si emette il comando

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

ps -eaH mostrerà che il gatto e le sue due code sono figli del guscio invocante:

 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.