這四個命令(fifo,程序替換,重定向……)有什麼區別?
我的目標是使用一個簡單的回顯伺服器
nc
和一個fifo
. 我不是在尋找最好的方法,我只是想了解以下命令的語義(什麼時候發生 fork,為什麼,它改變了什麼,為什麼命令的行為不同……)。我正在使用 Bash,所以我不確定所有命令是否都適用於 POSIX
sh
或zsh
,ksh
, …這是我在標題中提到的四個命令(假設我已經這樣做了
mkfifo fifo
):cat fifo | nc -l localhost 8888 > fifo exec 3<> fifo && nc -l localhost 8888 <&3 >&3 && exec 3>&- nc -l localhost 8888 <(cat fifo) > fifo nc -l localhost 8888 < fifo > fifo
現在我希望這 4 個命令做同樣的事情,至少最後兩個命令做同樣的事情。
- 第一個命令按預期執行,一個簡單的回顯伺服器,在客戶端關閉連接時關閉。
- 行為類似於 1。
- 我可以連接到伺服器,發送數據,但我從來沒有收到任何回复。當我關閉客戶端連接時,伺服器關閉。
- 無法連接到伺服器,伺服器一直在監聽。
這裡的關鍵是打開 FIFO 是一個阻塞操作。只有在
open
兩端都連接後才會返回,即一旦 fifo 對讀寫都打開。Normally, opening the FIFO blocks until the other end is opened also.
在第一種情況下,shell fork 執行管道,因此打開 fifo 進行讀取 (
cat fifo
) 和打開 fifo 進行寫入 (> fifo
) 發生在不同的程序中,因此獨立發生。在第二種情況下,打開讀取和打開寫入 (
3<>fifo
) 發生在一個步驟中。在第三種情況下,
<(cat fifo)
擴展為文件名,例如/dev/fd/42
. 所以就像你在跑步一樣nc -l localhost 8888 /dev/fd/42 > fifo
。您需要額外<
的才能使其等效,例如nc -l localhost 8888 < <(cat fifo) > fifo
.在第 4 種情況下,作為同一程序的一部分,shell 試圖打開 fifo 以進行讀取 (
< fifo
) 並打開它以進行寫入 ( )。> fifo
shell 一次只做一個,從左到右。所以它試圖打開fifo
讀取,並永遠阻塞,等待打開fifo
寫入的東西。我想你會發現在這種情況下,nc
甚至從未啟動過,並且從未打開埠進行偵聽。