什么是命名pipe道?
他们是什么,他们是如何工作的?
上下文碰巧是SQL Server
在Windows和POSIX系统上,命名pipe道为在同一台计算机上运行的进程间进行进程间通信提供了一种途径。 命名pipe道给你的是一种发送你的数据的方式,而不会影响涉及networking堆栈的性能。
就像你有一个服务器监听传入请求的IP地址/端口一样,服务器也可以设置一个可以监听请求的命名pipe道。 无论哪种情况,客户端进程(或数据库访问库)都必须知道发送请求的具体地址(或pipe道名称)。 通常存在常用的标准缺省值(非常类似于HTTP端口80,SQL服务器使用TCP / IP中的端口1433; \\。\ pipe \ sql \ query命名pipe道)。
通过设置额外的命名pipe道,可以运行多个数据库服务器,每个服务器都有自己的请求侦听器。
命名pipe道的优点是通常速度更快,并释放networking堆栈资源。
– 顺便说一句,在Windows世界里,你也可以有远程计算机的命名pipe道 – 但是在这种情况下,命名pipe道是通过TCP / IP传输的,所以你将失去性能。 使用命名pipe道进行本地机器通信。
Unix和Windows都有称为“命名pipe道”的东西,但是它们的行为有所不同。 在Unix上,命名pipe道是一条单行道,通常只有一个读者和一个作者 – 作者写道,读者读到,你明白了吗?
在Windows上,称为“命名pipe道”的东西是一个更像是TCP套接字的IPC对象 – 事物可以双向stream动,并且有一些元数据(您可以获得另一端的东西的凭证等)。
Unix命名pipe道作为文件系统中的一个特殊文件出现,可以通过包括shell在内的正常文件IO命令进行访问。 Windows的没有,并需要打开一个特殊的系统调用(之后,他们的行为大多像一个正常的Win32手柄)。
更令人困惑的是,Unix有一个叫做“Unix套接字”或AF_UNIX套接字的东西,它更像是一个win32“命名pipe道”(但不完全相同),是双向的。
Linuxpipe道
先入先出(FIFO)间处理通信机制。
无名pipe道
在命令行中,用“|”表示 在两个命令之间。
命名pipe道
一个FIFO专用文件。 一旦创build,就可以像普通文件一样使用pipe道(打开,closures,写入,读取等)。
从命令行( 手册页 )创build一个名为“myPipe”的命名pipe道:
mkfifo myPipe
要从c创build一个命名pipe道,其中“pathname”是你希望pipe道拥有的名称,“mode”包含你想要pipe道的权限( 手册页 ):
#include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);
根据维基百科 :
[…]传统的pipe道是“未命名的”,因为它是匿名存在的,只有在进程运行时才存在。 一个命名pipe道是系统永久性的,并且存在超过该进程的生命周期,并且一旦不再被使用,它必须“解除链接”或被删除。 进程通常附加到命名pipe道(通常作为文件出现)来执行IPC(进程间通信)。
比较
echo "test" | wc
至
mkdnod apipe p wc apipe
wc会阻塞,直到
echo "test" > apipe
执行
pipe道是在应用程序之间传输数据的一种方式。 在Linux下,我一直使用这个来将一个进程的输出stream化到另一个进程。 这是匿名的,因为目标应用程序不知道inputstream来自哪里。 它不需要。
命名pipe道只是一种主动挂接到现有pipe道并填充其数据的方式。 这适用于供应商不知道客户会吃什么数据的情况。
Windows应用程序的进程间通信(大部分)。 类似于使用套接字在Unix中的应用程序之间进行通信。
MSDN
在unix / linux环境中的命名pipe道可以用来使两个不同的shell进行通信,因为一个shell不能与另一个shell共享任何东西。
此外,在同一个shell中两次实例化的脚本不能通过这两个实例共享任何内容。 在编写包含start()和stop()函数的守护进程时,我发现了一个用于命名pipe道的用法,我想用同一个脚本来执行这两个操作。
没有命名pipe道(或任何types的信号量)在后台启动脚本不是一个问题。 事情是什么时候完成你只是不能访问背景中的实例。
所以,当你想给他发送停止命令时,你不能:运行相同的脚本,如果没有命名pipe道,并且调用stop()函数将不会执行任何操作,因为你实际上正在运行另一个实例。
解决scheme是在启动守护进程时实现两个pipe道,一个READ和另一个WRITE。 然后让他在其他任务中听取READpipe道。 然后,Stop()函数包含一个将在pipe道中写入消息的命令,该消息将由后台运行脚本处理,该脚本将执行退出0.这样,同一脚本的第二个实例只能执行任务:告诉一审停止。
这样,只有一个脚本可以启动和停止。
当然,你有不同的方式来触发例如通过触摸停止。 但是这个代码很好,很有趣。
这是从Technet exeprt(所以不知道为什么标记的答案说命名pipe道更快?):
命名pipe道与TCP / IP套接字
在快速局域网(LAN)环境中,传输控制协议/ Internet协议(TCP / IP)套接字和命名pipe道客户端在性能方面具有可比性。 但是,对于较慢的networking(如广域网(WAN)或拨号networking),TCP / IP套接字和命名pipe道客户端之间的性能差异会变得明显。 这是因为进程间通信(IPC)机制在对等体之间进行通信的方式不同。
对于命名pipe道,networking通信通常更具交互性。 一个对等体不会发送数据,直到另一个对等体使用读命令来请求它。 networking读取通常包括一系列窥探命名pipe道消息,然后开始读取数据。 在networking速度较慢的情况下,这些代价可能非常高昂,并导致networkingstream量过大 ,从而影响其他networking客户端。
澄清你是否在谈论本地pipe道或networkingpipe道也很重要。 如果服务器应用程序在运行SQL Server实例的计算机上本地运行,则本地命名pipe道协议是一个选项。 本地命名pipe道以内核模式运行,速度非常快。
对于TCP / IP套接字,数据传输更简化,开销更小。 数据传输还可以利用TCP / IP套接字性能增强机制,如窗口化,延迟确认等等。 这可以在缓慢的networking中非常有用。 取决于应用的types,这种性能差异可能是显着的。
TCP / IP套接字也支持积压队列。 与命名pipe道相比,这可以提供有限的平滑效果,当您尝试连接到SQL Server时,可能导致pipe道繁忙错误。
通常,TCP / IP在较慢的局域网,广域网或拨号networking中是首选,而当networking速度不是问题时,命名pipe道可能是更好的select,因为它提供了更多的function,易用性和configuration选项。
命名pipe道:
-
命名pipe道使用进程间通信(IPC)通道进行高效的服务器间通信以及局域网(LAN)通信。
-
命名pipe道协议在SQL Server 2008中有一些增强function,包括对encryptionstream量的支持,但由于在跨networking或防火墙连接时命名pipe道的额外开销以及命名pipe道需要打开的附加端口(445)
- 将Named Pipes协议保留为禁用通常是一个好主意。
- 有很多应用程序利用命名pipe道协议,因为它们是为本地networking实现而devise的。
- 命名pipe道可以方便地访问单个安全域内的远程过程调用(RPC),这对于这些应用程序是有利的。
- 如果您需要支持其中一个应用程序需要访问(RPC),并且SQL Server不会暴露给外部stream量,则启用命名pipe道协议和相应端点的风险很小。
- 命名pipe道协议还提供了与被访问的SQL Server数据库位于同一个框中的客户端应用程序所使用的高性能优势,
- 命名pipe道还可以方便客户端连接到远程SQL Server数据库或不同机器上的SQL Server主机
- 命名pipe道有两个可configuration的属性•启用:启用属性与共享内存协议相同。 •pipe道名称:pipe道名称指定SQL Server将侦听的进程间pipe道。 默认pipe道是\。\ pipe \ sql \ query。
命名pipe道是用于进程间通信的窗口系统。 在SQL服务器的情况下,如果服务器与客户端在同一台机器上,则可以使用命名pipe道传输数据,而不是TCP / IP。