Pipe
為什麼文件重定向到命名管道和從命名管道不起作用,但管道到 cat 呢?
這是一個簡單的 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
打開localhost
,4458
您將收到“連接被拒絕”錯誤。
這是因為 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 進行寫入,反之亦然。