Solución:
Las tuberías con nombre (FIFO) tienen cuatro tres ventajas en las que puedo pensar:
- no tienes que iniciar los procesos de lectura / escritura al mismo tiempo
- puede tener varios lectores / escritores que no necesita ascendencia común
- como un archivo, puede controlar la propiedad y los permisos
-
son tuberías bidireccionales sin nombre mayo ser unidireccional**) Piense en un caparazón estándar
|
tubería que es unidireccional, varias capas (ksh
,zsh
, ybash
) también ofrecen coprocesos que permiten la comunicación bidireccional. POSIX trata las tuberías como semidúplex (es decir, cada lado solo puede leer o escribir), elpipe()
La llamada al sistema devuelve dos identificadores de archivo 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 lo prohíbe POSIX), en otros necesitaría dos conductos, uno para cada dirección. Revisar supipe()
,popen()
y posiblementepopen2()
páginas man. La no direccionalidad puede no depender de si la tubería tiene un nombre o no, aunque en Linux 2.6 sí depende.
(Actualizado, gracias a los comentarios de Stephane Chazelas)
Por lo tanto, una tarea obvia que no puede lograr con una tubería sin nombre es una aplicación cliente / servidor convencional.
El último punto (afectado) anterior sobre las tuberías unidireccionales es relevante en Linux, POSIX (consulte popen()
) dice que una tubería solo necesita ser legible o escribible, en Linux son unidireccionales. Ver Entendiendo el Kernel de Linux (3rd Ed. O’Reilly) para detalles específicos de Linux (p787). Otros sistemas operativos ofrecen tuberías bidireccionales (sin nombre).
Como ejemplo, Nagios usa un Fifo para su archivo de comando. Varios procesos externos (scripts CGI, comprobaciones externas, NRPE, etc.) escriben comandos / actualizaciones en este quince y estos son procesados por el proceso persistente de Nagios.
Las canalizaciones con nombre tienen características similares a las conexiones TCP, pero existen diferencias importantes. Debido a que un quince tiene un nombre de sistema de archivos persistente, puede escribir en él incluso cuando no hay un lector, es cierto que las escrituras se bloquearán (sin E / S asíncronas o sin bloqueo), aunque no perderá datos si el receptor no lo está. iniciado (o se está reiniciando).
Como referencia, consulte también Sockets de dominio Unix y la respuesta a esta pregunta de Stackoverflow que resume los principales métodos de IPC, y esta que habla de popen()
Las canalizaciones anónimas o sin nombre proporcionan un medio de comunicación entre procesos unidireccional y uno a uno entre diferentes procesos que están relacionados por una relación padre-hijo o por ser hijos de un padre común que proporciona la canalización, como un shell proceso. Debido a que los procesos están relacionados, la asociación de descriptores de archivo a la tubería puede ser implícita y no requiere un objeto con un nombre que sea externo a los procesos. Una canalización sin nombre existe solo mientras los procesos que la utilizan mantengan descriptores de archivo abiertos en la canalización. Cuando los procesos salen y el sistema operativo cierra todos los descriptores de archivos asociados con los procesos, la tubería sin nombre se cierra.
Las tuberías con nombre son de hecho FIFO. Estos son objetos persistentes representados por nodos en el sistema de archivos. Una canalización con nombre proporciona una comunicación bidireccional de muchos a muchos entre uno o más procesos que no están necesariamente relacionados y no necesitan existir al mismo tiempo. El nombre de archivo de la tubería sirve como dirección o contrato entre los procesos de comunicación. Si solo un proceso escribe en una canalización con nombre y otro proceso lee desde la canalización con nombre, entonces la canalización con nombre se comporta de la misma manera que una canalización sin nombre entre los dos procesos relacionados.
Entonces, la respuesta corta es que necesita una tubería con nombre para la comunicación entre procesos no relacionados que pueden no existir al mismo tiempo.
Hay otra ventaja de las canalizaciones con nombre: puede usarlas en diferentes sistemas. Suponga que desea la comunicación en tiempo real de dos procesos que se ejecutan en diferentes máquinas. Luego comparta una carpeta entre los dos, coloque su FIFO en la carpeta y listo. Es considerablemente más fácil que transformar una aplicación diseñada para trabajar con archivos en un servicio que escucha en un puerto.