什么是命名管道?

Bri*_*n G 125 sql-server pipe named-pipes

它们是什么以及它们如何工作?

上下文恰好是SQL Server

Toy*_*der 142

在Windows和POSIX系统上,命名管道提供了在同一台机器上运行的进程之间进行进程间通信的方法.命名管道给你的是一种发送数据的方法,而不会涉及网络堆栈的性能损失.

就像你有一个服务器监听传入请求的IP地址/端口一样,服务器也可以设置一个可以监听请求的命名管道.在任何一种情况下,客户端进程(或DB访问库)都必须知道发送请求的特定地址(或管道名称).通常,存在常用的标准默认值(非常类似于HTTP的端口80,SQL服务器在TCP/IP中使用端口1433;对于命名管道,使用\\.\ pipe\sql\query).

通过设置其他命名管道,您可以运行多个数据库服务器,每个服务器都有自己的请求侦听器.

命名管道的优点是它通常更快,并释放网络堆栈资源.

- 顺便说一句,在Windows世界中,您还可以将命名管道命名为远程计算机 - 但在这种情况下,命名管道通过TCP/IP传输,因此您将失去性能.使用命名管道进行本地机器通信.

  • @lindhe整个网络没有自动可操作性.一般在实践中更难建立.Windows中的实现不同于Unix/Unix类系统.它们很酷,但除非性能是必须的,否则我不会打扰. (2认同)

Mar*_*rkR 39

Unix和Windows都有称为"命名管道"的东西,但它们的行为不同.在Unix上,一个命名管道是一条单行道,通常只有一个读者和一个作者 - 作者写道,读者读,你得到它?

在Windows上,称为"命名管道"的东西是一个更像TCP套接字的IPC对象 - 事物可以双向流动,并且有一些元数据(您可以在另一端获取事物的凭据等).

Unix命名管道在文件系统中显示为特殊文件,可以使用包括shell在内的普通文件IO命令进行访问.Windows不需要,并且需要使用特殊的系统调用打开(之后它们的行为大致类似于普通的win32句柄).

更令人困惑的是,Unix有一种称为"Unix套接字"或AF_UNIX套接字的东西,它更像(但不完全像)一个win32"命名管道",是双向的.


Joh*_*der 22

Linux管道
先进先出(FIFO)进程间通信机制.

未命名的管道
在命令行上,由"|"表示 两个命令之间.

命名管道
FIFO特殊文件.创建后,您可以像普通文件一样使用管道(打开,关闭,写入,读取等).

要从命令行(手册页)创建名为"myPipe"的命名管道:

mkfifo myPipe  
Run Code Online (Sandbox Code Playgroud)

要从c创建命名管道,其中"pathname"是您希望管道具有的名称,"mode"包含您希望管道具有的权限(手册页):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
Run Code Online (Sandbox Code Playgroud)

  • “你可以像普通文件一样使用管道” - 不完全正确。您既不能在管道中使用“tell()”定位,也不能使用“seek()”。 (2认同)

Jon*_*ski 16

根据维基百科:

[...]传统的管道是"未命名的",因为它是匿名存在的,只有在进程运行时才会持续存在.命名管道是系统持久性的,并且存在于进程的生命周期之外,并且必须在不再使用时被"取消链接"或删除.进程通常附加到命名管道(通常显示为文件)以执行IPC(进程间通信).


Joh*_*son 11

相比

echo "test" | wc
Run Code Online (Sandbox Code Playgroud)

mkdnod apipe p
wc apipe
Run Code Online (Sandbox Code Playgroud)

wc会阻止直到

echo "test" > apipe
Run Code Online (Sandbox Code Playgroud)

执行


小智 7

这是 Technet 的一个 exeprt(所以不知道为什么标记的答案说命名管道更快??):

命名管道与 TCP/IP 套接字

在快速局域网 (LAN) 环境中,传输控制协议/互联网协议 (TCP/IP) 套接字和命名管道客户端在性能方面具有可比性。但是,TCP/IP 套接字和命名管道客户端之间的性能差异在网络速度较慢的情况下变得明显,例如跨广域网 (WAN) 或拨号网络。这是因为进程间通信 (IPC) 机制在对等方之间进行通信的方式不同。

对于命名管道,网络通信通常更具交互性。一个对等点不会发送数据,直到另一个对等点使用读取命令请求它。网络读取通常在开始读取数据之前涉及一系列 peek 命名管道消息。这些在慢速网络中可能非常昂贵,并导致网络流量过多,进而影响其他网络客户端。

澄清您是在谈论本地管道还是网络管道也很重要。如果服务器应用程序在运行 SQL Server 实例的计算机上本地运行,则可以选择本地命名管道协议。本地命名管道在内核模式下运行并且速度非常快。

对于 TCP/IP Sockets,数据传输更加流畅,开销更少。数据传输还可以利用 TCP/IP 套接字性能增强机制,例如窗口化、延迟确认等。这在慢速网络中非常有用。根据应用程序的类型,这种性能差异可能很大。

TCP/IP 套接字还支持积压队列。与在您尝试连接到 SQL Server 时可能导致管道忙错误的命名管道相比,这可以提供有限的平滑效果。

通常,TCP/IP 在慢速 LAN、WAN 或拨号网络中是首选,而当网络速度不是问题时,命名管道可能是更好的选择,因为它提供了更多的功能、易用性和配置选项。


Oli*_*Oli 6

管道是一种在应用程序之间传输数据的方式.在Linux下,我一直使用它来将一个进程的输出流式传输到另一个进程.这是匿名的,因为目标应用程序不知道输入流来自何处.它不需要.

一个命名管道只是积极地钩住现有管道和吸尘器吸尘,其数据的方式.这是供应商不知道客户将吃什么数据的情况.


Ken*_*Ken 5

Windows应用程序的进程间通信(主要是).类似于使用套接字在Unix中的应用程序之间进行通信.

MSDN

  • 命名管道出现在大约1975年的V6或AT&T Unix中. (4认同)