¿Qué se llaman tuberías?

Respuestas:

153

Tanto en sistemas Windows como POSIX, las canalizaciones con nombre proporcionan una forma de comunicación entre procesos entre procesos que se ejecutan en la misma máquina. Lo que las canalizaciones con nombre le brindan es una forma de enviar sus datos sin tener la penalización de rendimiento de involucrar a la pila de red.

Al igual que tiene un servidor que escucha una dirección / puerto IP para las solicitudes entrantes, un servidor también puede configurar una tubería con nombre que puede escuchar las solicitudes. En cualquier caso, el proceso del cliente (o la biblioteca de acceso a la base de datos) debe conocer la dirección específica (o el nombre de la tubería) para enviar la solicitud. A menudo, existe un valor predeterminado estándar comúnmente utilizado (al igual que el puerto 80 para HTTP, el servidor SQL usa el puerto 1433 en TCP / IP; \\. \ Pipe \ sql \ query para una tubería con nombre).

Al configurar canalizaciones con nombre adicionales, puede tener varios servidores de base de datos en ejecución, cada uno con sus propios escuchas de solicitud.

La ventaja de las canalizaciones con nombre es que generalmente es mucho más rápido y libera recursos de pila de red.

- Por cierto, en el mundo de Windows, también puede haber canalizaciones con nombre a máquinas remotas, pero en ese caso, la canalización con nombre se transporta a través de TCP / IP, por lo que perderá rendimiento. Use tuberías con nombre para la comunicación local de la máquina.

Constructor de juguetes
fuente
1
¿Cuál es la desventaja?
lindhe
2
@lindhe Sin operabilidad automática en toda la red. Generalmente más difícil de configurar en la práctica. Implementación diferente en Windows que en sistemas tipo Unix / Unix. Son geniales, pero no me molestaría a menos que el rendimiento sea obligatorio.
sudo
43

Unix y Windows tienen cosas llamadas "Canalizaciones con nombre", pero se comportan de manera diferente. En Unix, una tubería con nombre es una calle de sentido único que generalmente tiene un solo lector y un escritor: el escritor escribe y el lector lee, ¿entiendes?

En Windows, lo que se denomina "canalización con nombre" es un objeto IPC más parecido a un socket TCP: las cosas pueden fluir en ambos sentidos y hay algunos metadatos (puede obtener las credenciales de la cosa en el otro extremo, etc.).

Las canalizaciones con nombre de Unix aparecen como un archivo especial en el sistema de archivos y se puede acceder con comandos normales de E / S de archivos, incluido el shell. Los de Windows no lo hacen, y deben abrirse con una llamada especial del sistema (después de lo cual se comportan principalmente como un controlador win32 normal).

Aún más confuso, Unix tiene algo llamado "zócalo Unix" o zócalo AF_UNIX, que funciona más como (pero no completamente) como un "tubo con nombre" win32, siendo bidireccional.

MarkR
fuente
23

Tubos de Linux
Mecanismo de comunicación interproceso de First In First Out (FIFO).

Tubos sin nombre
en la línea de comando, representada por un "|" entre dos comandos

Tubos con nombre
Un archivo especial FIFO. Una vez creado, puede usar la tubería como un archivo normal (abrir, cerrar, escribir, leer, etc.).

Para crear una tubería con nombre, llamada "myPipe", desde la línea de comandos ( página man ):

mkfifo myPipe  

Para crear una tubería con nombre desde c, donde "nombre de ruta" es el nombre que desea que tenga la tubería y "mode" contiene los permisos que desea que tenga la tubería ( página de manual ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
John Mulder
fuente
2
"puede usar la tubería como un archivo normal", no del todo cierto. No se puede tell()colocar ni seek()en una tubería.
nyov
19

De acuerdo con Wikipedia :

[...] Una tubería tradicional no tiene nombre porque existe de forma anónima y persiste solo mientras el proceso se esté ejecutando. Una canalización con nombre es persistente en el sistema y existe más allá de la vida del proceso y debe "desvincularse" o eliminarse una vez que ya no se utiliza. Los procesos generalmente se unen a la tubería con nombre (generalmente aparece como un archivo) para realizar IPC (comunicación entre procesos).

Jonathan Lonowski
fuente
12

Comparar

echo "test" | wc

a

mkdnod apipe p
wc apipe

WC bloqueará hasta

echo "test" > apipe

ejecuta

John Nilsson
fuente
7

Las tuberías son una forma de transmitir datos entre aplicaciones. En Linux, uso esto todo el tiempo para transmitir la salida de un proceso a otro. Esto es anónimo porque la aplicación de destino no tiene idea de dónde proviene ese flujo de entrada. No necesita hacerlo.

Una tubería con nombre es solo una forma de engancharse activamente en una tubería existente y aspirar sus datos. Es para situaciones en las que el proveedor no sabe qué clientes se comerán los datos.

Oli
fuente
6

Este es un extracto de Technet (¿no está seguro de por qué la respuesta marcada dice que las canalizaciones con nombre son más rápidas?):

Tuberías con nombre vs. Sockets TCP / IP

En un entorno rápido de red de área local (LAN), los Sockets de Protocolo de Control de Transmisión / Protocolo de Internet (TCP / IP) y los clientes de Canalizaciones con Nombre son comparables con respecto al rendimiento. Sin embargo, la diferencia de rendimiento entre los clientes TCP / IP Sockets y Named Pipes se hace evidente con las redes más lentas, como las redes de área amplia (WAN) o las redes de acceso telefónico. Esto se debe a las diferentes formas en que los mecanismos de comunicación entre procesos (IPC) se comunican entre pares.

Para las canalizaciones con nombre, las comunicaciones de red suelen ser más interactivas. Un par no envía datos hasta que otro par lo solicite utilizando un comando de lectura. Una lectura de red generalmente involucra una serie de mensajes de canalización con nombre antes de comenzar a leer los datos. Estos pueden ser muy costosos en una red lenta y causar tráfico de red excesivo. , que a su vez afecta a otros clientes de la red.

También es importante aclarar si está hablando de tuberías locales o tuberías de red. Si la aplicación del servidor se ejecuta localmente en la computadora que ejecuta una instancia de SQL Server, el protocolo de canalizaciones con nombre local es una opción. Las canalizaciones con nombre locales se ejecutan en modo kernel y son muy rápidas.

Para los sockets TCP / IP, las transmisiones de datos son más optimizadas y tienen menos sobrecarga. Las transmisiones de datos también pueden aprovechar los mecanismos de mejora del rendimiento de los Sockets TCP / IP, tales como ventanas, confirmaciones retrasadas, etc. Esto puede ser muy útil en una red lenta. Dependiendo del tipo de aplicaciones, tales diferencias de rendimiento pueden ser significativas.

Los sockets TCP / IP también admiten una cola de trabajos pendientes. Esto puede proporcionar un efecto de suavizado limitado en comparación con las canalizaciones con nombre que podría provocar errores de ocupado cuando intente conectarse a SQL Server.

En general, se prefiere TCP / IP en una red LAN, WAN o de acceso telefónico lenta, mientras que las canalizaciones con nombre pueden ser una mejor opción cuando la velocidad de la red no es el problema, ya que ofrece más funcionalidad, facilidad de uso y opciones de configuración.

Ness
fuente
5

Comunicación entre procesos (principalmente) para aplicaciones de Windows. Similar al uso de sockets para comunicarse entre aplicaciones en Unix.

MSDN

Conocido
fuente
44
Las pipas con nombre aparecieron en V6 o AT&T Unix alrededor de 1975.
dmckee --- ex-gatito moderador
Doh! Eso es un poco antes de Microsoft. Hasta donde sé, no se usan con frecuencia en aplicaciones Unix / Linux. ¿Cierto?
Ken
Utilizo una canalización con nombre para mi generador de firma aleatoria, dado que las aplicaciones de correo y usenet esperan que un archivo llamado $ HOME / .signature tenga su firma, mi programa crea .signature como una canalización con nombre y escribe citas aleatorias en él.
Paul Tomblin
3

Las canalizaciones con nombre en un contexto unix / linux se pueden usar para hacer dos shells diferentes para comunicarse, ya que un shell simplemente no puede compartir nada con otro.

Además, un script instanciado dos veces en el mismo shell no puede compartir nada a través de las dos instancias. Encontré un uso para las canalizaciones con nombre al codificar un demonio que contiene la función start () y stop (), y quería usar el mismo script para realizar las dos acciones.

Sin canalizaciones con nombre (o cualquier tipo de semáforo), iniciar el script en segundo plano no es un problema. La cuestión es que cuando termina, simplemente no puede acceder a la instancia en segundo plano.

Entonces, cuando desea enviarle el comando de detención, simplemente no puede: ejecutar el mismo script sin canalizaciones con nombre y llamar a la función stop () no hará nada ya que realmente está ejecutando otra instancia.

La solución fue implementar dos tuberías, una LEER y la otra ESCRIBIR cuando inicies el demonio. Luego haz que, entre sus otras tareas, escuche el tubo READ. Luego, la función Stop () contiene un comando que escribirá un mensaje en la tubería, que será manejado por el script en ejecución en segundo plano que realizará una salida 0. De esta manera, nuestra segunda instancia del mismo script solo tiene una tarea que hacer: dile a la primera instancia que pare.

De esta forma, un solo script puede iniciarse y detenerse.

Por supuesto, tiene diferentes formas de hacerlo activando la parada mediante un toque, por ejemplo. Pero este es agradable e interesante de codificar.

Nicolas Mas
fuente
1

Las tuberías con nombre son un sistema de Windows para la comunicación entre procesos. En el caso del servidor SQL, si el servidor está en la misma máquina que el cliente, entonces es posible usar canalizaciones con nombre para transferir los datos, a diferencia de TCP / IP.

eulerfx
fuente
No es solo de Windows, ya que su respuesta lo hace aparecer. Como otros ya han notado, las tuberías con nombre han existido desde los años 70 en UNIX, generalmente con la apariencia de ser un archivo especial. Votado de todos modos, pero arregle su respuesta.
Chris Charabaruk