在Linux Bash中使用命名管道的示例

问题描述 投票:49回答:4

有人可以在Linux中发布一个在Bash中使用命名管道的简单示例吗?

linux bash pipe
4个回答
84
投票

实用命名管道的最佳例子之一......

来自http://en.wikipedia.org/wiki/Netcat

另一个有用的行为是使用netcat作为代理。端口和主机都可以重定向。看看这个例子:

nc -l 12345 | nc www.google.com 80

端口12345表示请求。

这将在端口12345上启动nc服务器,并将所有连接重定向到google.com:80。如果网络浏览器向nc发出请求,该请求将被发送到谷歌但响应将不会发送到网络浏览器。这是因为管道是单向的。这可以使用命名管道来重定向输入和输出。

mkfifo backpipe
nc -l 12345  0<backpipe | nc www.google.com 80 1>backpipe

29
投票

打开两个不同的壳,并将它们并排放置。在两者中,转到/tmp/目录:

cd /tmp/

在第一种类型中:

mkfifo myPipe
echo "IPC_example_between_two_shells">myPipe

在第二个中,键入:

while read line; do echo "What has been passed through the pipe is ${line}"; done<myPipe

在第二个shell中执行代码的第二部分之前,第一个shell不会给你任何提示。这是因为fifo读写是阻塞的。

您还可以通过执行ls -al myPipe查看FIFO类型,并查看此特定类型文件的详细信息。

下一步是将代码放入脚本中!


27
投票

以下是命令:

$ mkfifo named_pipe

$ echo "Hi" > named_pipe &

$ cat named_pipe

第一个命令创建管道。

第二个命令写入管道(阻塞)。 &将此放入后台,以便您可以继续在同一个shell中键入命令。当下一个命令清空FIFO时,它将退出。

最后一个命令从管道中读取。


2
投票

1号航站楼:

$ mknod new_named_pipe p
$ echo 123 > new_named_pipe
  • 终端1创建了一个命名管道。
  • 它使用echo在其中写入数据。
  • 它被阻止,因为没有接收端(因为命名和未命名的管道都需要接收和写入结束)

2号航站楼:

$ cat new_named_pipe
$ 123
$ 
  • 从终端2,添加数据的接收端。
  • 它使用cat读取其中的数据。
  • 由于new_named_pipe都有接收和写入结束,因此它会显示信息并阻止停止

命名管道在Linux中随处可见,我们在ls -l命令中看到的大多数char和块文件都是char和block管道(所有这些都位于/ dev)。这些管道可以阻塞和非阻塞,主要优点是这些为IPC提供了最简单的方法。

© www.soinside.com 2019 - 2024. All rights reserved.