socket de dominio Unix VS canalizaciones con nombre?

122

Después de mirar un socket llamado Unix y pensé que se llamaban tuberías. Miré las pipas de nombres y no vi mucha diferencia. Vi que se inicializaron de manera diferente, pero eso es lo único que noto. Ambos usan la función de escritura / lectura de C y funcionan igual AFAIK.

¿Cuál es la diferencia entre sockets de dominio Unix y canalizaciones con nombre? ¿Cuándo elegiría uno sobre el otro? ¿Cuál debería usar de forma predeterminada (como usar el vector de forma predeterminada en C ++ en lugar de usar deque, list o cualquier otra cosa si tengo necesidades)?


fuente
1
@GregHewgill: desafortunadamente esa pregunta es más sobre "qué es IPC" en lugar de la diferencia que estoy preguntando: /. Lo vi antes de publicar, ¿debería haber vinculado y dicho que está relacionado? (no fue útil para mí)
1
@acid: Sí, vincular preguntas relacionadas y explicar qué pregunta todavía tienes es siempre una buena idea.
Ben Voigt
3
Este artículo lo resumió bastante bien. Desmitificando los zócalos de dominio Unix: thomasstover.com/uds.html
Cong Ma
Enlace roto: techdeviancy.com/uds.html
mcdado

Respuestas:

106

Los sockets de dominio UNIX son generalmente más flexibles que las canalizaciones con nombre. Algunas de sus ventajas son:

  • Puede utilizarlos para la comunicación de más de dos procesos (por ejemplo, un proceso de servidor con varios procesos de cliente potencialmente conectados);
  • Son bidireccionales;
  • Admiten el paso de credenciales UID / GID verificadas por el kernel entre procesos;
  • Admiten el paso de descriptores de archivos entre procesos;
  • Admiten modos de paquetes y paquetes secuenciados.

Para utilizar muchas de estas características, es necesario utilizar el send()/ recv()la familia de las llamadas al sistema en lugar de write()/ read().

coste y flete
fuente
11
Por otro lado, quizás debería decirse que las canalizaciones de nombres tienen la ventaja de que se pueden "conectar" mediante open(2)llamadas ordinarias , lo que las hace más adecuadas para construir canalizaciones ad-hoc entre programas que normalmente solo aceptan argumentos de nombre de archivo.
Dolda2000
66

Una diferencia es que las canalizaciones con nombre son unidireccionales, por lo que deberá utilizar dos de ellas para establecer una comunicación bidireccional. Los enchufes, por supuesto, son bidireccionales. Parece un poco más complicado usar dos variables en lugar de una (es decir, dos tuberías en lugar de un enchufe).

Además, el artículo de wikipedia es bastante claro sobre el siguiente punto : "Los sockets de dominio Unix se pueden crear como flujos de bytes o como secuencias de datagramas, mientras que las canalizaciones son solo flujos de bytes".


Las tuberías con nombre son, de hecho, bidireccionales pero semidúplex . Esto significa que la comunicación puede ir del extremo A al extremo B o del B al A, pero nunca ambos al mismo tiempo.

jtoberon
fuente
1
hmm interesante +1. ¿Sabe por casualidad cuál es la diferencia entre bytestream y datagrama? ¿Quizás un ejemplo en una o dos sesiones como ya lo hizo para esta pregunta?
7
@acidzombie: una tubería o socket en modo datagrama mantiene los límites, de modo que una writellamada produce una readllamada. En el modo de flujo, los datos se pueden concatenar juntos en un flujo largo, por lo que se pueden leer muchas escrituras a la vez, o viceversa. (Windows tiene tuberías de datagramas, según la respuesta de jtoberon, Unix no las tiene)
Ben Voigt
1
@BenVoigt Bueno, la entrega de paquetes de socket de datagramas no es confiable, por lo que una escritura no necesariamente generará una llamada de lectura. Quizás para enchufes locales, pero eso no está claro en su comentario. Entonces, independientemente de que tenga problemas.
xaxxon
3
@xaxxon: tanto las tuberías como los sockets de dominio Unix son locales, por lo que sin pérdidas el receptor está vaciando sus colas en absoluto.
Ben Voigt
6
Sí, a diferencia de UDP, los sockets de dominio Unix de datagramas están garantizados , entrega en orden.
jtchitty