linux windows 命名管道,为什么要在Linux上使用命名管道

a67669498fb7fce52d60c9024e7b3f7f.png

不经常使用命名管道,但是它们为进程间通信提供了一些有趣的功能.

估计每个Linux用户都熟悉使用“ |”的操作符号,用于将数据从一个过程传输到另一个过程. 它使用户可以轻松地将数据从一个命令输出到另一个命令,并过滤掉所需的数据,而无需编写用于选择,重新格式化和其他操作的脚本.

还有另一种管道,尽管名称“ pipe”在本质上也有很大不同. 也就是说,您可能尚未使用甚至不知道命名管道.

普通管道和命名管道之间的主要区别之一是,命名管道实际上以文件形式存在于文件系统中. 是的,它们显示为文件. 但是与其他文件不同,命名管道文件似乎从来没有文件内容. 即使用户将大量数据写入命名管道创建命名管道,文件仍然看起来为空.

在研究这些空的命名管道之前,让我们回到根源,看看如何创建命名管道. 您应该使用一个名为mkfifo的命令来创建它们. 为什么提到“ FIFO”?这是因为命名管道也被视为特殊的FIFO文件. 术语“ FIFO”是指其先进先出特性. 如果将冰淇淋放在盘子上然后品尝,则说明您正在执行LIFO(后进先出操作. 如果您通过吸管喝奶昔,那么您将执行FIFO操作. 好吧,接下来是创建命名管道的示例.

3c76ca17502c48100953044e7d59e1cf.png

$ mkfifo mypipe

$ ls -l mypipe

prw-r-----. 1 shs staff 0 Jan 31 13:59 mypipe

请注意特殊文件类型标记“ p”,文件大小为0. 您可以将重定向数据写入命名管道文件,文件大小仍为0.

$ echo Can you read this? > mypipe

如上所述,按Enter键后似乎什么也没发生(LCTT注释: 没有返回命令行提示符).

打开另一个终端并检查命名管道的大小,它仍为0:

1ebfa1ceefd58c88df8bf59032f31d13.png

$ ls -l mypipe

prw-r-----. 1 shs staff 0 Jan 31 13:59 mypipe

也许这是违反直觉的. 用户输入的文本已输入命名管道,而您仍然停留在输入中. 您或其他人应等待输出,并准备读取放入管道中的数据. 现在,让我们阅读它.

$ cat mypipe

Can you read this?

一旦读取,管道中的内容就消失了.

研究命名管道如何工作的另一种方法是通过将数据放入后台操作(将数据放入管道并在另一段中读取数据)来执行两个操作.

7a082e453d903e04a6107546de67d633.png

$ echo Can you read this? > mypipe &

[1] 79302

$ cat mypipe

Can you read this?

[1]+ Done echo Can you read this? > mypipe

一旦读取或“消耗”了管道,便会清空该管道,尽管我们仍然可以看到并再次使用它. 但是,为什么要为此麻烦呢?

很少使用命名管道的原因似乎很好. 毕竟,在Unix系统上,总是有许多不同的方法来完成相同的操作. 尽管命名管道比它们更有效,但是有许多方法可以写入文件,读取文件和清空文件.

值得注意的是,命名管道的内容驻留在内存中,而不是写入硬盘. 仅当输入和输出端子都打开时,才传输数据内容. 用户可以在打开管道输出之前多次写入管道. 通过使用命名管道,用户可以创建一个进程,其中一个进程写入该管道,另一个进程从该管道读取,而不必担心协调二者之间的时间同步.

用户可以创建一个过程,简单地等待数据出现在管道的输出端,并在接收到输出数据后对其进行操作. 对于以下命令,我们使用tail来等待数据显示.

e3d27db16394809cf34d6b6a978c73f4.png

$ tail -f mypipe

一旦提供管道数据的过程结束,我们就会看到一些输出.

$ tail -f mypipe

Uranus replicated to WCDC7

Saturn replicated to WCDC8

Pluto replicated to WCDC9

Server replication operation completed

如果您查看写入命名管道的过程创建命名管道,那么用户可能会对它消耗资源很少感到惊讶. 在下面的ps命令的输出中,唯一重要的资源消耗是虚拟内存(VSZ列).

ps u -P 80038

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

shs 80038 0.0 0.0 108488 764 pts/4 S 15:25 0:00 -bash

命名管道与Unix / Linux系统上更常用的管道有足够的不同,以具有另一个名称,但是“管道”确实反映了它们如何在进程之间传输数据的图像,因此将其称为““命名管道”是非常合适的. 也许您可以在执行操作时从此巧妙的Unix / Linux功能中受益匪浅.

通过: networkworld.com/article/3251853/linux/why-use-named-pipes-on-linux.html

作者: Sandra Henry-Stocker译者: YPBlib校对: wxy

本文最初由LCTT编写,Linux China荣幸地发布

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-288045-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值