Bash

這四個命令(fifo,程序替換,重定向……)有什麼區別?

  • June 15, 2014

我的目標是使用一個簡單的回顯伺服器nc和一個fifo. 我不是在尋找最好的方法,我只是想了解以下命令的語義(什麼時候發生 fork,為什麼,它改變了什麼,為什麼命令的行為不同……)。

我正在使用 Bash,所以我不確定所有命令是否都適用於 POSIXshzsh, 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. 第一個命令按預期執行,一個簡單的回顯伺服器,在客戶端關閉連接時關閉。
  2. 行為類似於 1。
  3. 我可以連接到伺服器,發送數據,但我從來沒有收到任何回复。當我關閉客戶端連接時,伺服器關閉。
  4. 無法連接到伺服器,伺服器一直在監聽。

這裡的關鍵是打開 FIFO 是一個阻塞操作。只有在open兩端都連接後才會返回,即一旦 fifo 對讀寫都打開。

人先進先出(7)

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) 並打開它以進行寫入 ( )。> fifoshell 一次只做一個,從左到右。所以它試圖打開fifo讀取,並永遠阻塞,等待打開fifo寫入的東西。我想你會發現在這種情況下,nc甚至從未啟動過,並且從未打開埠進行偵聽。

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