¿Cuáles son las ventajas de usar tubería con nombre sobre la tubería sin nombre?

Estaba revisando un set de preguntas de la entrevista que se hacen desde un administrador de Unix; Encontré un tema llamado "named pipe".

Busqué en Google el tema; Hasta cierto punto, he podido entenderlo: – tuberías con nombre || FIFO

Pero aún siento que me falta el conocimiento de cuándo usar este tipo particular de tubería. ¿Hay alguna situación especial en la que las tuberías sin nombre no funcionen?

Las tuberías con nombre (fifo) tienen cuatro ventajas que se me ocurren:

  • no tiene que iniciar los processs de lectura / escritura al mismo time
  • puedes tener múltiples lectores / escritores que no necesitan ancestros comunes
  • como file puede controlar la propiedad y los permissions
  • son bidireccionales, las tuberías sin nombre pueden ser unidireccionales *

    *) Piensa en un caparazón estándar | tubería que es unidireccional, varias conchas ( ksh , zsh y bash ) también ofrecen coprocesss que permiten la comunicación bidireccional. POSIX trata las tuberías como semidúplex (es decir, cada lado solo puede leer o escribir), la llamada al sistema pipe() devuelve dos identificadores de file y es posible que deba tratar uno como de solo lectura y el otro como de solo escritura. Algunos sistemas (BSD) admiten lectura y escritura simultáneamente (no prohibido por POSIX), en otros necesitaría dos tubos, uno para cada dirección. Verifique las páginas man de pipe() , popen() y posiblemente popen2() . La propiedad indirecta puede no depender de si el conducto tiene nombre o no, aunque en Linux 2.6 es dependiente.

(Actualizado, gracias a los comentarios de Stephane Chazelas )

Entonces, una tarea obvia inmediata que no se puede lograr con una tubería sin nombre es una aplicación cliente / server convencional.

El último punto (golpeado) sobre las tuberías unidireccionales es relevante en Linux, POSIX (ver popen() ) dice que una tubería solo necesita ser legible o escribible , en Linux son unidireccionales . Consulte Understanding The Linux Kernel (3rd Ed. O'Reilly) para get detalles específicos de Linux (p787). Otros sistemas operativos ofrecen tubos bidireccionales (sin nombre).

Como ejemplo, Nagios usa un fifo para su file de command . Diversos processs externos (scripts CGI, controles externos, NRPE, etc.) escriben commands / actualizaciones en este fifo y estos son procesados ​​por el process persistente de Nagios.

Las tuberías con nombre tienen características similares a las conexiones TCP, pero existen diferencias importantes. Como un fifo tiene un nombre persistente en el sistema de files, puede escribir incluso cuando no haya un lector, es cierto que las escrituras se bloquearán (sin E / S no bloqueadas o sin locking), aunque no perderá datos si el receptor no lo está. iniciado (o se reinicia).

Como reference, vea también los sockets de dominio de Unix , y la respuesta a esta pregunta Stackoverflow que resume los principales methods de IPC , y esta que habla de popen()

Las canalizaciones anónimas o sin nombre proporcionan un medio de comunicación interprocess unidireccional y unidireccional entre diferentes processs que están relacionados por una relación padre-hijo, o por ser hijos de un padre común que proporciona el conducto, como un intérprete de commands process. Debido a que los processs están relacionados, la asociación de los descriptores de files al conducto puede ser implícita y no requiere un object con un nombre que sea externo a los processs. Una tubería sin nombre existe solo mientras el process que la use mantenga descripciones abiertas de files en la tubería. Cuando los processs finalizan y el sistema operativo cierra todos los descriptores de files asociados con los processs, el conducto sin nombre se cierra.

Las tuberías con nombre son, de hecho, FIFO. Estos son objects persistentes representados por nodos en el sistema de files. Un conducto con nombre proporciona comunicación de muchos a varios y de dos vías entre uno o más processs que no están necesariamente relacionados y no necesitan existir al mismo time. El nombre de file de la tubería sirve como una dirección o contrato entre los processs de comunicación. Si solo un process escribe en un conducto con nombre y otro process lee desde el conducto con nombre, entonces el conducto con nombre se comporta de la misma manera que un conducto sin nombre entre los dos processs relacionados.

Entonces, la respuesta corta es que necesita un conducto con nombre para la comunicación entre processs no relacionados que podrían no existir al mismo time.

Una ventaja no mencionada en otra parte es que una tubería con nombre se puede usar en lugares donde solo funcionará un file.

Por ejemplo, algunos clientes de correo electrónico tienen la function de agregar los contenidos de ~ / .signature a cada post de correo. Si .signature fuera una opción de command-line o si el cliente de correo pudiese notar que .signature es ejecutable y ejecutarlo, entonces no necesitaría un pipe con nombre. Pero si el cliente de correo no es tan sofisticado, puede crear un conducto con nombre llamado .signature y ejecutar una aplicación que genere una nueva firma cada vez que se lea el file.

Hay otra ventaja de los tubos con nombre: puede usarlos en diferentes sistemas . Supongamos que desea la comunicación en time real de dos processs que se ejecutan en diferentes máquinas. Luego, comparta una carpeta entre las dos, coloque su FIFO en la carpeta y listo. Es considerablemente más fácil que transformar una aplicación diseñada para trabajar en files en un service que escucha en un puerto.