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

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

这是 Unix 中的一个简单的 echo 服务器,使用 nc:

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

您会注意到,如果您尝试telnet打开localhost4458您将收到“连接被拒绝”错误。

答案1

这是因为 netcat 命令还没有启动!当尝试打开 fifo 进行输入时,shell 将阻塞。尝试

strace cat >fifo <fifo

你什么也看不到。相反,使用,例如,

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

它打开 fifo 以作为标准输入进行读写,然后将其复制到标准输出。


跟踪完整的 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 进行写入,反之亦然。

相关内容