File-Descriptors

從文件描述符讀取失敗

  • February 5, 2015

這個問題是關於文件描述符的讀寫。請參見以下範例:

#!/bin/sh

file='somefile'

# open fd 3 rw
exec 3<> "$file"

# write something to fd 3
printf "%s\n%s\n" "foo" "bar" >&3

# reading from fd 3 works
cat "/proc/$$/fd/3"

# only works if the printf line is removed
cat <&3

exit 0

該腳本輸出:

foo
bar

預期輸出:

foo
bar
foo
bar

打開並寫入文件描述符成功。通過閱讀也是如此proc/$$/fd/3。但這不是便攜的。cat <&3不輸出任何東西。然而,當文件描述符未被寫入時(例如取消註釋該printf行),它可以工作。

為什麼不起作用cat <&3以及如何從可移植的文件描述符(POSIX shell)中讀取全部內容?

cat <&3完全按照它應該做的事情,即從文件中讀取,直到到達文件末尾。當您呼叫它時,文件描述符上的文件位置是您上次離開它的位置,即文件末尾。(有一個文件位置,而不是單獨的用於讀取和寫入的位置。)

cat /proc/$$/fd/3不做同樣的事情cat <&3:它在不同的描述符上打開同一個文件。由於每個文件描述符都有自己的位置,並且在打開文件進行讀取時位置設置為 0,因此該命令會列印整個文件並且不會影響腳本。

如果您想讀回您寫的內容,您需要重新打開文件或倒回文件描述符(即,將其位置設置為 0)。在 POSIX shell 和大多數 sh 實現中都沒有內置的方法(在 ksh93 中有一個)。只有一個實用程序可以搜尋:dd,但它只能向前搜尋。(還有其他實用程序可能會向前跳過,但這無濟於事。)

我認為唯一可移植的解決方案是記住文件名並根據需要多次打開它。請注意,如果文件不是正常文件,您可能無論如何都無法向後搜尋。

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