文件和連結到文件的文件描述符之間的區別

文件和連結到文件的文件描述符之間的區別

我有一個包含四行的文件:

$ cat file
First line
Second line
Third line
Fourth line
$ 

當我讀這個文件四次時,我總是讀第一行,這是預期的結果:

$ for i in {1..4}; do read line <file; echo "$line" ; done
First line
First line
First line
First line
$ 

但是,當我連結檔案描述符 3file然後以相同的方式讀取它時,每個讀取都會「吃掉」輸入流:

$ exec 3<file
$ for i in {1..4}; do read -u 3 line; echo "$line" ; done
First line
Second line
Third line
Fourth line
$

為什麼文件描述符有這樣的行為?

答案1

當您說:read var <file命令完成後文件描述符將關閉。因此,在下一次循環中,檔案描述符將重設為開頭。

在這種情況下exec 3<file,當您說read -r -u 3 var即使讀取命令完成並且讀取位置已更新時,檔案描述符仍保持開啟狀態,因此下一次,讀取將抓取下一行。

注意:即使你已經這樣做了,exec 0<fileread -r var仍然會有類似的行為。

答案2

簡單的答案是,這就是它們的工作原理——檔案描述符包含一個狀態,其中包括讀取和寫入位置。對一個檔案描述符執行的每次讀取都會移動讀取位置,無論是誰在讀取它 - 檔案描述符僅包含一個讀取位置。

換句話說,當(由作業系統)建立檔案描述符時,它也會建立一個包含這些狀態變數的結構/表。表中只有一份讀取位置的副本,每次在檔案描述子上呼叫 read() 函數時,都會更新單一讀取位置變數。

相關內容