这是 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
打开localhost
,4458
您将收到“连接被拒绝”错误。
答案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 进行写入,反之亦然。