为什么文件到命名管道之间的重定向不起作用,而管道到cat却起作用?


8

这是使用nc的Unix中的简单回显服务器:

mkfifo fifo
cat fifo | nc -k -l 4458 -v | cat >fifo

(基于

如我所见,数据流的工作方式如下:

fifo (my named pipe)
 |
 | (using cat)
 |
 v
nc
 |
 | (using cat)
 |
 v
fifo 

这里是一个问题:为什么这不起作用?

nc -k -l 4458 -v >fifo <fifo

你会发现,如果试图telnetlocalhost4458,你会得到一个“连接被拒绝”的错误。


我没有答案,但希望这可能会帮助比我更有知识的人。cat myfifo | nc -k -l 4458 > myfifo也可以。如果使用这样的文本文件file.txt,则nc -k -l 4458 < file.txt > file.txt第一个连接将连接并关闭(因为输入被截断并且EOF关闭了套接字,这很有意义),第二个连接将成为健忘的回显服务器:它将回显每隔一行并将未显示的行保存到文本文件中。
user1794469

Answers:


9

这是因为netcat命令尚未启动!尝试打开fifo作为输入时,shell会阻塞。尝试

strace cat >fifo <fifo

而且您什么也看不到。而是使用例如

nc -k -l 4458 -v <>fifo >&0

这将打开fifo,以stdin的身份进行读取和写入,然后将其复制到stdout。


跟踪完整的bash命令将显示打开未进行读或写返回(直到完成相反的打开):

$ strace -f -e open bash -c 'nc -k -l 4458 -v  >fifo <fifo'
...
Process 3631 attached
[pid  3631] open("fifo", O_WRONLY|O_CREAT|O_TRUNC, 0666

$ strace -f -e open bash -c 'nc -k -l 4458 -v  <fifo >fifo'
...
Process 3684 attached
[pid  3684] open("fifo", O_RDONLY

man 3 mkfifo:打开FIFO以正常读取块,直到其他进程打开相同的FIFO进行写入为止,反之亦然。


1
封锁记录在案:tldp.org/LDP/lpg/node19.html
thrig

为什么在使用“> fifo <fifo”时外壳会阻塞?看来它将打开以供编写然后供阅读。那么,既然已经有一个写句柄被打开,它是否应该正常继续?
拉兹万

@Razvan我用fifo的两个打开替代顺序的实际strace更新了答案,您可以看到该打开可写或读两个块。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.