它们是什么以及它们如何工作?
上下文恰好是SQL Server
在Windows和POSIX系统上,命名管道提供了在同一台机器上运行的进程之间进行进程间通信的方法.命名管道给你的是一种发送数据的方法,而不会涉及网络堆栈的性能损失.
就像你有一个服务器监听传入请求的IP地址/端口一样,服务器也可以设置一个可以监听请求的命名管道.在任何一种情况下,客户端进程(或DB访问库)都必须知道发送请求的特定地址(或管道名称).通常,存在常用的标准默认值(非常类似于HTTP的端口80,SQL服务器在TCP/IP中使用端口1433;对于命名管道,使用\\.\ pipe\sql\query).
通过设置其他命名管道,您可以运行多个数据库服务器,每个服务器都有自己的请求侦听器.
命名管道的优点是它通常更快,并释放网络堆栈资源.
- 顺便说一句,在Windows世界中,您还可以将命名管道命名为远程计算机 - 但在这种情况下,命名管道通过TCP/IP传输,因此您将失去性能.使用命名管道进行本地机器通信.
Unix和Windows都有称为"命名管道"的东西,但它们的行为不同.在Unix上,一个命名管道是一条单行道,通常只有一个读者和一个作者 - 作者写道,读者读,你得到它?
在Windows上,称为"命名管道"的东西是一个更像TCP套接字的IPC对象 - 事物可以双向流动,并且有一些元数据(您可以在另一端获取事物的凭据等).
Unix命名管道在文件系统中显示为特殊文件,可以使用包括shell在内的普通文件IO命令进行访问.Windows不需要,并且需要使用特殊的系统调用打开(之后它们的行为大致类似于普通的win32句柄).
更令人困惑的是,Unix有一种称为"Unix套接字"或AF_UNIX套接字的东西,它更像(但不完全像)一个win32"命名管道",是双向的.
Linux管道
先进先出(FIFO)进程间通信机制.
未命名的管道
在命令行上,由"|"表示 两个命令之间.
命名管道
FIFO特殊文件.创建后,您可以像普通文件一样使用管道(打开,关闭,写入,读取等).
要从命令行(手册页)创建名为"myPipe"的命名管道:
mkfifo myPipe
要从c创建命名管道,其中"pathname"是您希望管道具有的名称,"mode"包含您希望管道具有的权限(手册页):
#include#include int mkfifo(const char *pathname, mode_t mode);
根据维基百科:
[...]传统的管道是"未命名的",因为它是匿名存在的,只有在进程运行时才会持续存在.命名管道是系统持久性的,并且存在于进程的生命周期之外,并且必须在不再使用时被"取消链接"或删除.进程通常附加到命名管道(通常显示为文件)以执行IPC(进程间通信).
相比
echo "test" | wc
至
mkdnod apipe p wc apipe
wc会阻止直到
echo "test" > apipe
执行
管道是一种在应用程序之间传输数据的方式.在Linux下,我一直使用它来将一个进程的输出流式传输到另一个进程.这是匿名的,因为目标应用程序不知道输入流来自何处.它不需要.
一个命名管道只是积极地钩住现有管道和吸尘器吸尘,其数据的方式.这是供应商不知道客户将吃什么数据的情况.
Windows应用程序的进程间通信(主要是).类似于使用套接字在Unix中的应用程序之间进行通信.
MSDN