socket de dominio unix VS canalizaciones con nombre?

4 minutos de lectura

Después de mirar un socket con nombre de Unix y pensé que se llamaban tuberías. Miré las tuberías de nombre 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 los sockets de dominio de Unix y las canalizaciones con nombre? ¿Cuándo elegiría uno sobre el otro? ¿Cuál debo usar de forma predeterminada (por ejemplo, cómo uso vector de forma predeterminada en C ++ que usar deque, list o cualquier otra cosa si tengo necesidades)?

  • @GregHewgill: desafortunadamente, esa pregunta es más sobre “qué es IPC” que sobre la diferencia que estoy preguntando:/. Lo vi antes de publicar, ¿debería haber vinculado y dicho que está relacionado? (no me sirvió)

    usuario34537

    28 de febrero de 2012 a las 2:28

  • @acid: Sí, siempre es una buena idea vincular preguntas relacionadas y explicar qué pregunta aún tienes.

    – Ben Voigt

    28 de febrero de 2012 a las 4:12

  • Este artículo lo resumió bastante bien. Desmitificando los sockets de dominio Unix: thomasstover.com/uds.html

    – Cong Ma

    3 de marzo de 2013 a las 3:59

  • Enlace roto: techdeviancy.com/uds.html

    – mcdado

    26 de diciembre de 2019 a las 17:09


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

  • Puede usarlos para más de dos procesos que se comunican (por ejemplo, un proceso de servidor con potencialmente múltiples procesos de cliente que se conectan);
  • Son bidireccionales;
  • Admiten el paso de credenciales UID/GID verificadas por kernel entre procesos;
  • Admiten pasar descriptores de archivos entre procesos;
  • Admiten modos de paquetes y paquetes secuenciados.

Para usar muchas de estas características, necesita usar el send() / recv() familia de llamadas al sistema en lugar de write() / read().

  • Por otro lado, tal vez debería decirse que las tuberías de nombres tienen la ventaja de que pueden “conectarse” a través de conexiones ordinarias. open(2) llamadas, lo que los hace más adecuados para construir canalizaciones ad-hoc entre programas que normalmente solo toman argumentos de nombre de archivo.

    – Dolda2000

    14 mayo 2016 a las 23:58

socket de dominio unix VS canalizaciones con nombre
jtoberon

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

Además, el artículo de wikipedia es bastante claro en 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 medio duplex. 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.

  • mmm interesante +1. ¿Sabes por casualidad cuál es la diferencia entre flujo de bytes y datagrama? ¿Quizás un ejemplo en una oración o dos como ya hiciste para esta pregunta?

    usuario34537

    28 de febrero de 2012 a las 2:29

  • @acidzombie: una tubería o socket en modo datagrama mantiene los límites, de modo que uno write llamada produce uno read llamada. En el modo de flujo, los datos se pueden concatenar en un flujo largo, por lo que se pueden leer muchas escrituras a la vez, o viceversa. (Windows tiene tuberías de datagramas, de acuerdo con la respuesta de jtoberon, Unix no las tiene)

    – Ben Voigt

    28 de febrero de 2012 a las 4:14


  • @xaxxon: ¿Leíste completamente mi comentario? La parte entre paréntesis explica que Windows los tiene aunque Unix no los tenga. Y si revisas los CreateNamedPipe documentaciónverás el PIPE_TYPE_MESSAGE bandera.

    – Ben Voigt

    1 de septiembre de 2013 a las 1:58

  • @xaxxon: Tanto las tuberías como los sockets de dominio de Unix están local, por lo que sin pérdidas el receptor está vaciando sus colas.

    – Ben Voigt

    1 de septiembre de 2013 a las 13:37

  • Sí, a diferencia de UDP, los sockets de dominio Unix de datagramas son garantizadoentrega en orden.

    – jtchitty

    21 de octubre de 2016 a las 5:37

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad