如何解决Bash 管道执行顺序
如果我在终端 1 上打开一个 nc
nc -l 35555
并在Terminal2上以这种方式进行连接
mkfifo /tmp/f
cat /tmp/f | nc 127.0.0.1 35555 > /tmp/f
现在我有几个问题
在 Terminal2 上,您可以看到正在等待的东西。那是什么?
- 是cat进程还是nc进程?
- 它们的执行顺序是什么?
如果我在 Terminal1 上写一个字符串,那个字符串就会回来。
- 为什么
cat /tmp/f | nc 127.0.0.1 35555 > /tmp/f
不创建循环?
接收到的字符串从 nc 出来并进入 /tmp/f。因为字符串开始输入nc的猫,发送回终端1并再次在/tmp/f等中
- 为什么 fifo 的猫不是阻塞操作?从技术上讲还没有结束,那么为什么要执行 nc?
谢谢。
解决方法
- 是cat进程还是nc进程?
两者兼而有之。 cat
正在等待将某些内容写入 FIFO。 nc
正在等待将某些内容写入其 stdin
或通过网络套接字接收某些内容。
- 它们的执行顺序是什么?
管道中的所有命令同时运行。
- 为什么
cat /tmp/f | nc 127.0.0.1 35555 > /tmp/f
不创建循环?
第一个终端不会发回它从网络接收到的内容,它只是将其打印到终端。当您在终端 1 上键入内容时,它会被写入网络一次。终端 2 上的 nc
将其写入 /tmp/f
。然后它读取它并将其发送到网络。终端 1 上的 nc
读取并打印它。就这样结束了。
-为什么fifo 的猫不是阻塞操作?技术上还没有结束,那么为什么要执行 nc 呢?
管道中的命令不会等待前一个退出。这样就不可能写出像
这样的代码tail -f filename | grep word
因为 tail -f
永远不会退出(直到你用 Ctl-c 杀死它,但这也会杀死 grep
)。所有进程都运行,这使得后面的程序可以处理前面程序的部分输出。
所以 nc
不会等待 cat
退出。它同时运行,并且可能使用 select()
或 epoll()
同时侦听来自 stdin
和网络套接字的输入(它也可能为每个使用单独的线程) .因此,当 cat
在 FIFO 上阻塞时,它可以从终端 1 读取网络数据,然后将其写入 FIFO。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。