Los sockets de dominio UNIX y FIFO pueden compartir parte de su implementación, pero conceptualmente son muy diferentes. FIFO funciona a un nivel muy bajo. Un proceso escribe bytes en la tubería y otro lee de él. Un socket de dominio UNIX tiene el mismo comportamiento que un socket TCP / IP.
Un socket es bidireccional y puede ser utilizado por muchos procesos simultáneamente. Un proceso puede aceptar muchas conexiones en el mismo socket y atender a varios clientes simultáneamente. El núcleo entrega un nuevo descriptor de archivo cada vez connect(2)
o accept(2)
se llama en el socket. Los paquetes siempre irán al proceso correcto.
En un FIFO, esto sería imposible. Para la comunicación bidireccional, necesita dos FIFO y un par de FIFO para cada uno de sus clientes. No hay forma de escribir o leer de forma selectiva, porque son una forma mucho más primitiva de comunicarse.
Las tuberías anónimas y los FIFO son muy similares. La diferencia es que las tuberías anónimas no existen como archivos en el sistema de archivos, por lo que ningún proceso puede open(2)
hacerlo. Son utilizados por procesos que los comparten por otro método. Si un proceso abre un FIFO y luego realiza, por ejemplo, a fork(2)
, su hijo heredará sus descriptores de archivo y, entre ellos, la tubería.
Los sockets de dominio UNIX, las canalizaciones anónimas y los FIFO son similares en el hecho de que usan segmentos de memoria compartida. Los detalles de la implementación pueden variar de un sistema a otro, pero la idea es siempre la misma: adjuntar la misma porción de memoria en dos procesos distintos de mapeo de memoria para que compartan datos
( editar: esa sería una forma obvia de implementarlo, pero eso es no cómo se hace realmente en Linux, que simplemente usa la memoria del núcleo para las memorias intermedias, consulte la respuesta de @ tjb63 a continuación).
El núcleo luego maneja las llamadas del sistema y abstrae el mecanismo.