Pipe

為什麼文件重定向到命名管道和從命名管道不起作用,但管道到 cat 呢?

  • October 26, 2016

這是一個簡單的 Unix 回顯伺服器,使用 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您將收到“連接被拒絕”錯誤。

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

引用自:https://unix.stackexchange.com/questions/284187