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)?
Respuestas:
Los sockets de dominio UNIX son generalmente más flexibles que las canalizaciones con nombre. Algunas de sus ventajas son:
Para utilizar muchas de estas características, es necesario utilizar el
send()
/recv()
la familia de las llamadas al sistema en lugar dewrite()
/read()
.fuente
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.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.
fuente
write
llamada produce unaread
llamada. 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)