這是 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 進行寫入,反之亦然。