¿Puedo conectar dos procesos entre sí?


8

En esta página de El diseño e implementación del sistema operativo 4.4BSD , se dice que:

Una diferencia importante entre las tuberías y los enchufes es que las tuberías requieren un proceso principal común para configurar el canal de comunicaciones.

Sin embargo, si grabo correctamente, la única forma de crear un nuevo proceso es con forkuno existente. Entonces, realmente no puedo ver cómo 2 procesos no podrían tener un ancestro común. ¿Tengo razón entonces al pensar que cualquier par de procesos se pueden canalizar entre sí?


1
Si su pregunta es realmente sobre un "antepasado común", eso no es lo que dice su cita. Un padre es un antepasado, pero no todos los antepasados ​​son padres.
msw

Eche un vistazo a ps auxfuna idea sobre los ancestros del proceso.
michas

@msw ¿quiere decir que los 2 procesos deben tener el mismo padre directo? ser primo (es decir, tener un abuelo común) no es suficiente?
qdii

Respuestas:


7

¿Tengo razón entonces al pensar que cualquier par de procesos se pueden canalizar entre sí?

Realmente no.

El proceso padre debe configurar las tuberías antes de que el niño o los niños se bifurquen. Una vez que el proceso secundario se bifurca, sus descriptores de archivo no se pueden manipular "desde afuera" (ignorando cosas como depuradores), el padre (o cualquier otro proceso) no puede hacer la parte de "configurar el canal de comunicaciones" después del hecho. .

Entonces, si toma dos procesos aleatorios que ya se están ejecutando, no puede configurar una tubería entre ellos directamente. Debe usar alguna forma de socket (u otro mecanismo de IPC) para que se comuniquen. (Pero tenga en cuenta que algunos sistemas operativos, FreeBSD entre ellos, le permiten enviar descriptores de archivos en sockets de dominio Unix).


4

Esa oración no es muy clara. Primero, el padre debe ser ancestro , ya que el proceso de configuración de la tubería puede ser padre, abuelo, abuelo, abuelo o uno de los procesos de comunicación. En segundo lugar, la oración no significa "si quieres una tubería, debe existir un proceso ancestro común", sino "si quieres una tubería, debe configurarse un proceso ancestral común".

Debajo del capó, un proceso establece una tubería consigo mismo. La canalización es un descriptor de archivo como cualquier otro, o más precisamente un par de descriptores de archivo, uno para cada extremo. El proceso que creó la tubería puede usarlo inmediatamente para enviarse datos a sí mismo, aunque esto rara vez es útil (aunque una tubería automática tiene su uso).

Un idioma típico es que un proceso establezca una tubería, luego bifurque un proceso hijo y cierre un extremo de la tubería en el padre y el otro extremo de la tubería en el niño. Esto permite que el proceso primario y secundario se comuniquen en una dirección. Si los procesos necesitan comunicación bidireccional, necesitan dos tuberías (excepto en algunas variantes de Unix donde las tuberías son bidireccionales).

Las tuberías son heredadas a su vez por cualquier hijo, por lo que el proceso que creó la tubería puede no estar involucrado en la comunicación. Por ejemplo, una tubería en un shell creada entre dos comandos externos, como ls | rot13los siguientes pasos:

  • El caparazón crea una tubería.
  • El shell bifurca un proceso. El niño cierra el extremo de lectura de la tubería y las llamadas execveen ls.
  • El shell bifurca un proceso. El niño cierra el extremo de escritura de la tubería y llama execveen rot13.
  • La carcasa cierra ambos extremos de la tubería y espera a que salgan ambos subprocesos.

Si dos procesos existentes desean comunicarse entre sí, pueden usar una tubería con nombre . (Bueno, también hay un descriptor de archivo que pasa , pero no es para los débiles de corazón).


2

El caparazón de la tubería es el padre común que establece un canal de comunicación entre los diversos miembros de la tubería.

Cualquier proceso puede ser canalizado a cualquier otro. Los únicos procesos que pueden canalizarse juntos son "filtros" que leen desde stdin y escriben en stdout.

Por ejemplo, si emite el comando

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

ps -eaH mostrará que el gato y sus dos colas son hijos del caparazón que invoca:

 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.