為什麼檔案重定向到命名管道不起作用,但管道到 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 進行寫入,反之亦然。

相關內容