web-dev-qa-db-fra.com

Quels sont les tuyaux nommés?

Que sont-ils et comment fonctionnent-ils?

Le contexte se trouve être SQL Server

123
Brian G

Sur les systèmes Windows et POSIX, les tubes nommés fournissent un moyen de communication entre processus entre processus s'exécutant sur le même ordinateur. Ce que vous donnez aux canaux nommés est un moyen d’envoyer vos données sans entraîner de perte de performances en impliquant la pile réseau.

Tout comme vous avez un serveur écoutant une adresse IP/un port pour les demandes entrantes, un serveur peut également configurer un canal nommé qui peut écouter les demandes. Dans les deux cas, le processus client (ou la bibliothèque d'accès à la base de données) doit connaître l'adresse spécifique (ou le nom du canal) à laquelle envoyer la demande. Il existe souvent une valeur par défaut standard couramment utilisée (à l'instar du port 80 pour HTTP, le serveur SQL utilise le port 1433 dans TCP/IP; \\.\Pipe\sql\query pour un canal nommé).

En configurant des canaux nommés supplémentaires, vous pouvez exécuter plusieurs serveurs de base de données, chacun avec ses propres écouteurs de demandes.

L'avantage des canaux nommés est qu'ils sont généralement beaucoup plus rapides et libèrent des ressources de pile réseau.

- BTW, dans le monde Windows, vous pouvez également affecter des canaux nommés à des machines distantes. Toutefois, dans ce cas, le canal nommé est transporté via TCP/IP, vous perdrez donc des performances. Utilisez des canaux nommés pour la communication avec la machine locale.

138
Toybuilder

Unix et Windows ont tous deux des choses appelées "Named Pipes", mais ils se comportent différemment. Sous Unix, un tube nommé est une rue à sens unique qui n’a généralement qu’un lecteur et un écrivain - l’écrivain écrit, et le lecteur lit, vous l’obtenez?

Sous Windows, la chose appelée "canal nommé" est un objet IPC plutôt un socket TCP - les choses peuvent circuler dans les deux sens et il existe des métadonnées ( Vous pouvez obtenir les informations d'identification de la chose à l'autre bout, etc.).

Les canaux nommés Unix apparaissent sous forme de fichier spécial dans le système de fichiers et sont accessibles avec les commandes fichier IO normales, y compris Shell. Les commandes Windows ne le font pas. après quoi ils se comportent principalement comme un handle Win32 normal).

Encore plus déroutant, Unix a ce qu’on appelle un "socket Unix" ou un socket AF_UNIX, qui fonctionne plutôt (mais pas tout à fait comme) un win32 "nommé tuyau", étant bidirectionnel.

38
MarkR

Linux Pipes
Premier entré premier sorti (FIFO) mécanisme de communication interproccess.

pipes sans nom
Sur la ligne de commande, représentée par un "|" entre deux commandes.

Tubes nommés
A FIFO. Une fois créé, vous pouvez utiliser le canal comme un fichier normal (ouvrir, fermer, écrire, lire, etc.).

Pour créer un canal nommé, appelé "myPipe", à partir de la ligne de commande ( page de manuel ):

mkfifo myPipe  

Pour créer un canal nommé à partir de c, où "chemin" correspond au nom que vous souhaitez attribuer au canal et "mode" contient les autorisations que vous souhaitez attribuer au canal ( page de manuel ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
22
John Mulder

Selon Wikipedia :

[...] Une pipe traditionnelle est "non nommée" car elle existe de manière anonyme et ne persiste que tant que le processus est en cours d'exécution. Un canal nommé est persistant dans le système et existe au-delà de la durée du processus et doit être "dissocié" ou supprimé dès qu'il n'est plus utilisé. Les processus s'attachent généralement au canal nommé (apparaissant généralement sous la forme d'un fichier) pour effectuer IPC (communication inter-processus).

16

Comparer

echo "test" | wc

à

mkdnod apipe p
wc apipe

wc va bloquer jusqu'à

echo "test" > apipe

exécute

10
John Nilsson

Communication interprocessus (principalement) pour les applications Windows. Semblable à l’utilisation de sockets pour communiquer entre applications sous Unix.

MSDN

5
Ken

Les pipes sont un moyen de diffuser des données entre des applications. Sous Linux, je l’utilise tout le temps pour diffuser la sortie d’un processus dans un autre. Ceci est anonyme car l'application de destination n'a aucune idée de l'origine de ce flux d'entrée. Ce n'est pas nécessaire.

Un tuyau nommé est simplement un moyen de s’accrocher activement à un tuyau existant et d’enrichir ses données. C'est pour les situations où le fournisseur ne sait pas quels clients vont manger les données.

5
Oli

C'est un exemple de Technet (vous ne savez donc pas pourquoi la réponse marquée indique que les pipes nommées sont plus rapides ??):

Named Pipes vs. TCP/IP Sockets

Dans un environnement de réseau local rapide (LAN), les clients Sockets et Named Pipes de Transmission Control Protocol/Internet Protocol (TCP/IP) sont comparables en termes de performances. Cependant, la différence de performances entre les clients TCP/IP Sockets et les clients Named Pipes devient évidente avec les réseaux plus lents, tels que les réseaux WAN ou les réseaux d'accès à distance. Cela est dû aux différentes manières dont les mécanismes de communication interprocessus (IPC) communiquent entre homologues.

Pour les canaux nommés, les communications réseau sont généralement plus interactives. Un pair n'envoie pas de données jusqu'à ce qu'un autre pair le demande à l'aide d'une commande de lecture. Une lecture en réseau implique généralement une série de messages de canal nommés avant de commencer à lire les données. Ceux-ci peuvent être très coûteux dans un réseau lent et causer un trafic réseau excessif, ce qui affecte à son tour les autres clients du réseau.

Il est également important de préciser si vous parlez de tuyaux locaux ou de tuyaux de réseau. Si l'application serveur s'exécute localement sur l'ordinateur qui exécute une instance de SQL Server, le protocole local Named Pipes est une option. Les canaux nommés locaux s'exécutent en mode noyau et sont très rapides.

Pour les sockets TCP/IP, les transmissions de données sont plus simples et nécessitent moins de temps système. Les transmissions de données peuvent également tirer parti des mécanismes d'amélioration des performances des sockets TCP/IP tels que le fenêtrage, les accusés de réception retardés, etc. Cela peut être très utile dans un réseau lent. Selon le type d'applications, ces différences de performances peuvent être importantes.

Les sockets TCP/IP prennent également en charge une file d'attente de backlog. Cela peut fournir un effet de lissage limité par rapport aux canaux nommés, ce qui peut entraîner des erreurs de canal occupé lorsque vous essayez de vous connecter à SQL Server.

Généralement, le protocole TCP/IP est préférable dans les réseaux LAN, WAN ou distants lents, alors que les canaux nommés peuvent constituer un meilleur choix lorsque la vitesse du réseau n’est pas un problème, car il offre davantage de fonctionnalités, une facilité d’utilisation et de configuration.

4
Ness

Les pipes nommées dans un contexte unix/linux peuvent être utilisées pour faire communiquer deux shells différents puisqu'un shell ne peut tout simplement pas partager quoi que ce soit avec un autre.

De plus, un script instancié deux fois dans le même shell ne peut rien partager entre les deux instances. Lors de la codification d'un démon contenant les fonctions start () et stop (), j'ai trouvé une utilisation des canaux nommés et je souhaitais utiliser le même script pour effectuer les deux actions.

Sans tuyaux nommés (ni aucun type de sémaphore), le démarrage du script en arrière-plan ne pose aucun problème. En fin de compte, vous ne pouvez tout simplement pas accéder à l'instance en arrière-plan.

Donc, lorsque vous voulez lui envoyer la commande stop, vous ne pouvez pas: exécuter le même script sans les tubes nommés et appeler la fonction stop () ne fera rien, car vous exécutez une autre instance.

La solution consistait à implémenter deux canaux, un READ et l'autre WRITE lorsque vous démarrez le démon. Ensuite, faites-lui écouter, entre autres tâches, le tuyau READ. Ensuite, la fonction Stop () contient une commande qui écrira un message dans le tuyau, qui sera géré par le script d’exécution en arrière-plan qui effectuera une sortie 0. Ainsi, notre deuxième instance du même script n’a plus qu’une tâche à accomplir: Dites au premier cas d'arrêter.

De cette façon, un et un seul script peut démarrer et s’arrêter.

Bien sûr, vous avez différentes façons de le faire, par exemple en déclenchant l'arrêt au toucher. Mais celui-ci est agréable et intéressant à coder.

3
Nicolas Mas

Les tubes nommés sont un système Windows pour la communication interprocessus. Dans le cas du serveur SQL, si le serveur est sur la même machine que le client, il est possible d'utiliser des canaux nommés pour transférer les données, par opposition à TCP/IP.

1
eulerfx