为什么使用命名管道而不是文件?

Modified on: Sat, 09 Jun 2018 22:48:53 +0800

我最近读过有关命名管道的内容,我无法理解为什么它们存在
我在某处读过,使用命名管道比使用文件耗时少。

为什么会这样?
命名管道也必须存储在内存中(也可以交换,就像文件一样)
据我所知,他们必须获得一个必须由当前目录引用的inode,就像文件一样。
此外,它们必须由程序员删除,就像文件一样。

那么优势在哪里?

最佳答案

Linux中的几乎所有内容都可以被视为文件,但常规文件命名管道之间的主要区别在于命名pipe是文件系统中没有内容的文件的特殊实例。

引用自man fifo

  

FIFO特殊文件(命名管道)类似于管道,但它作为文件系统的一部分进行访问。它可以通过多个读取或写入过程打开。当进程通过FIFO交换数据时,内核会在内部传递所有数据,而不会将其写入文件系统。因此,FIFO特殊文件在文件系统上没有内容;文件系统条目仅用作参考点,以便进程可以使用文件系统中的名称访问管道。

  
  

内核为每个由至少一个进程打开的FIFO特殊文件保留一个管道对象。在传递数据之前,必须在两端打开FIFO(读取和写入)。通常,打开FIFO块直到另一端打开。

因此,实际上命名管道在某些进程读取和写入之前不会执行任何操作。它不占用硬盘上的任何空间(除了一些元信息),它不使用CPU。

你可以这样做检查:

创建命名管道

$ mkfifo /tmp/testpipe

转到某个目录,例如/home/user/Documents,并使用命名管道gzip其中的所有内容。

$ cd /home/user/Documents
$ tar cvf - . | gzip > /tmp/testpipe &
[1] 28584

在这里你应该看到gzip进程的PID。在我们的例子中它是28584。

现在检查这个PID正在做什么

$ ps u -P 28584
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
c0rp     28584  0.0  0.0  29276  7800 pts/8    S    00:08   0:00 bash

您会看到它正在使用无资源。 0%CPU使用率,0%内存使用率。

验证有关文件空间使用情况的预感

$ du -h /tmp/testpipe
0   testpipe

再次0,什么都没有。如果需要,可以再次使用测试管。

不要忘记使用kill -15 28584杀死gzip。并使用rm /tmp/testpipe

删除我们的命名管道

示例用法

您可以使用命名管道重定向几乎所有内容。例如,您可以看到一线代理

另外这是另一个命名管道使用的很好的解释。您可以在一台服务器上配置两个进程,以使用命名管道而不是TCP / IP堆栈进行通信。它更快,并且不加载网络资源。例如,您的Web服务器可以使用命名管道直接与数据库通信,而不是使用localhost地址或侦听某个端口。

作者:Community,c0rp

相关问答

添加新评论