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

用户名

我最近阅读了有关命名管道的信息,但我不明白为什么它们存在。
我在某处读到,使用命名管道比使用文件耗时少。

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

那么优势在哪里呢?

c0rp

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

这是引用自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,什么都没有。如果需要,可以再次使用测试管。

不要忘记使用杀死gzip kill -15 28584并使用删除我们的命名管道rm /tmp/testpipe

用法示例

您可以使用命名管道重定向几乎所有内容。作为示例,您可以看到这一行代理

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么要使用Express而不是AngularJS?

来自分类Dev

为什么要使用Django的collectstatic而不是直接从静态目录中直接提供文件?

来自分类Dev

为什么要使用ImageIcon而不是Image?

来自分类Dev

自类型注释,为什么要使用self:=>而不是val?

来自分类Dev

为什么要使用新线程而不是未来{...}

来自分类Dev

Swift构造函数为什么使用命名参数调用?

来自分类Dev

为什么要使用命名空间(PHP)

来自分类Dev

为什么要使用文档存储而不是常规文件存储?

来自分类Dev

使用命名空间std后,为什么还要包含头文件<iostream>?

来自分类Dev

为什么我不需要使用命名空间?

来自分类Dev

为什么要使用Runnable而不是Thread?

来自分类Dev

为什么要使用链接到stdin的文件描述符,而不是直接使用stdin?

来自分类Dev

为什么要使用as.factor()而不是仅使用factor()

来自分类Dev

为什么要使用移位而不是for循环?

来自分类Dev

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

来自分类Dev

为什么要使用Char而不是String?

来自分类Dev

使用命名管道和套接字而不是临时文件的优点

来自分类Dev

Swift构造函数为什么使用命名参数调用?

来自分类Dev

为什么要使用fillRect而不是translation?

来自分类Dev

使用命名管道的程序崩溃

来自分类Dev

为什么我不需要使用命名空间?

来自分类Dev

为什么要使用资源而不是路由?

来自分类Dev

如何使用命名管道作为临时文件?

来自分类Dev

为什么要使用isinstance()而不是type()?

来自分类Dev

为什么要使用随机字符串作为文件名而不是逻辑名称?

来自分类Dev

与未命名管道相比,使用命名管道有什么优势?

来自分类Dev

为什么使用命名管道会在 C 中给出随机字符?

来自分类Dev

使用命名管道模拟进程替换

来自分类Dev

在 c 中使用命名管道

Related 相关文章

  1. 1

    为什么要使用Express而不是AngularJS?

  2. 2

    为什么要使用Django的collectstatic而不是直接从静态目录中直接提供文件?

  3. 3

    为什么要使用ImageIcon而不是Image?

  4. 4

    自类型注释,为什么要使用self:=>而不是val?

  5. 5

    为什么要使用新线程而不是未来{...}

  6. 6

    Swift构造函数为什么使用命名参数调用?

  7. 7

    为什么要使用命名空间(PHP)

  8. 8

    为什么要使用文档存储而不是常规文件存储?

  9. 9

    使用命名空间std后,为什么还要包含头文件<iostream>?

  10. 10

    为什么我不需要使用命名空间?

  11. 11

    为什么要使用Runnable而不是Thread?

  12. 12

    为什么要使用链接到stdin的文件描述符,而不是直接使用stdin?

  13. 13

    为什么要使用as.factor()而不是仅使用factor()

  14. 14

    为什么要使用移位而不是for循环?

  15. 15

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

  16. 16

    为什么要使用Char而不是String?

  17. 17

    使用命名管道和套接字而不是临时文件的优点

  18. 18

    Swift构造函数为什么使用命名参数调用?

  19. 19

    为什么要使用fillRect而不是translation?

  20. 20

    使用命名管道的程序崩溃

  21. 21

    为什么我不需要使用命名空间?

  22. 22

    为什么要使用资源而不是路由?

  23. 23

    如何使用命名管道作为临时文件?

  24. 24

    为什么要使用isinstance()而不是type()?

  25. 25

    为什么要使用随机字符串作为文件名而不是逻辑名称?

  26. 26

    与未命名管道相比,使用命名管道有什么优势?

  27. 27

    为什么使用命名管道会在 C 中给出随机字符?

  28. 28

    使用命名管道模拟进程替换

  29. 29

    在 c 中使用命名管道

热门标签

归档