
Linux 中的 shell(例如:bash
)的stdin
和stdout
和stderr
檔案描述子都指向同一個裝置文件,例如,以下是 的stdin
和stdout
和stderr
檔案描述符bash
:
Now/dev/tty1
不是一個可以讀取和寫入的「真實」文件,它是一個指向文件或記憶體中的緩衝區或其他內容的設備文件。
現在我的問題是,是/dev/tty1
只指向一個文件,還是指向兩個文件?
我的意思是,當從( )bash
讀取時,以及向(或)寫入時,是從 ( ) 讀取還是向 ( ) 寫入/dev/tty1
stdin
bash
/dev/tty1
stdout
stderr
相同的文件,還是/dev/tty1
指向兩個文件,一個在讀取時使用/dev/tty1
,另一個在寫入時使用/dev/tty1
?
答案1
一個設備節點指向一個裝置,在 Linux 中由核心處理。當bash
read from時/dev/tty1
,它會從管理第一終端的裝置驅動程式中讀取;當它寫入時,它會寫入相同的裝置驅動程式。
答案2
設備文件並不「指向多個文件」。設備文件甚至不“指向”單一文件。設備文件指向驅動程式。此驅動程式包含處理讀取和寫入操作的程式碼。
從裝置讀取的資料和寫入的資料之間不必存在關係。有些設備有,有些則沒有。例如,對於磁碟,在某個位置讀取的資料是先前寫入到該位置的資料。另一方面,對於串行端口,寫入設備的數據通過串行線發送,從設備讀取的數據通過串行線接收;發送的內容與接收的內容無關。
終端非常類似於串行設備。事實上,歷史上,實體終端通常透過串行線連接。當應用程式從終端檔案讀取時,它會接收由終端驅動程式或終端模擬器發送的資料- 終端驅動程式/模擬器將輸入寫入終端的一側,應用程式從終端的一側讀取輸入。當應用程式寫入終端檔案時,它會發送數據,然後由終端驅動程式或終端模擬器讀取資料- 應用程式將輸出寫入終端的一側,終端驅動程式/模擬器將輸出讀取到終端的一側。