File-Descriptors

命名管道、文件描述符和 EOF

  • June 20, 2018

兩個視窗,同一使用者,帶有 bash 提示。在 window-1 類型中:

$ mkfifo f; exec <f

所以 bash 現在正試圖從映射到命名管道的文件描述符 0 中讀取f。在 window-2 類型中:

$ echo ls > f

現在 window-1 列印一個 ls 然後 shell 死掉了。為什麼?

下一個實驗:用 再次打開 window-1 exec <f。在 window-2 類型中:

$ exec 3>f
$ echo ls >&3

在上面的第一行之後,window-1 被喚醒並列印一個提示。為什麼?在上面的第二行之後,window-1 列印ls輸出並且 shell 保持活動狀態。為什麼?實際上,現在在window-2 中,echo ls > f並沒有關閉window-1 外殼。

答案一定與window-2中引用命名管道的文件描述符3的存在有關?!

它與文件描述符的關閉有關。

在您的第一個範例中,echo寫入其標準輸出流,shell 打開該流以將其與 連接f,當它終止時,其描述符被關閉(由 shell)。在接收端,從其標準輸入流(連接到f)讀取輸入的 shell 讀取ls、執行ls,然後由於其標準輸入上的文件結束條件而終止。

文件結束條件的發生是因為命名管道的所有寫入者(本例中只有一個)都關閉了管道的末端。

在您的第二個範例中,exec 3>f打開文件描述符 3 以寫入f,然後echo寫入ls它。現在打開文件描述符的是shell,而不是echo命令。描述符保持打開狀態,直到您這樣做exec 3>&-。在接收端,從其標準輸入流(連接到f)讀取輸入的 shellls執行ls,然後等待更多輸入(因為流仍然打開)。

流保持打開狀態,因為它的所有寫入者(shell、viaexec 3>fecho)都沒有關閉它們的管道末端(exec 3>f仍然有效)。


我在上面寫過echo,好像它是一個外部命令。它很可能是內置在外殼中的。效果還是一樣的。

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