我可以存取終端檔案嗎?

我可以存取終端檔案嗎?

1970 年代,我們有了硬體終端 CUI。

現在,在我的 Linux 盒子中,我看到七個終端機模擬器,其中 GUI 佔據了第 7 個終端模擬器 (Ctrl+Alt+F7)。

例如,這是我的第一個終端(Ctrl+Alt+F1)模擬器

$ tty
/dev/tty0

>cat在使用者空間中按ENTER 鍵時,cat進程會等待stdin接收來自/dev/tty0檔案的輸入。我無法/dev/tty0使用任何編輯器檢視文件。

進程stdin和都在處理文件。stdoutcat/dev/tty0

問題:

使用某些編輯器,此終端檔案可以/dev/tty0在使用者空間中存取嗎?

答案1

您一直在存取終端文件。但這並不像您想像的那樣。

當您寫入磁碟文件,然後從中讀取時,您讀取的就是您寫入的。對於終端機等特殊檔案來說,情況並非如此。文件是可以寫入和讀取的東西;寫入內容和讀取內容之間的聯繫取決於文件​​的性質。對於字元設備文件,通常根本沒有連結。

終端檔案連接兩個扮演不同角色的實體:終端本身和想要與使用者互動的應用程式。終端可以是由核心表示的硬件,也可以是終端模擬器(它是一個行程)。當應用程式寫入資料時,終端開始讀取資料(並且通常以某種方式將其顯示給使用者);當應用程式讀取資料時,資料來自終端(通常是使用者輸入的)。

在您的情況下,應用程式依次是shell、cat、編輯器等。結束做出正確反應(您可以透過在行首按 Ctrl+D 來發出訊號)。再說一次,從終端機讀取不會為你帶來以前的東西輸出到航站樓。

對於控制台,寫入終端的資料將繪製在螢幕上。使用 Linux 控制台,/dev/tty1可以從裝置讀回顯示的文本/dev/vcs1只要它保持可顯示(因此您只能獲得螢幕上顯示的內容,加上向後滾動仍可用的內容;向後滾動無法到達的任何內容都將永遠丟失)。

請注意,這是 Linux 終端介面提供的功能。終端可以簡單地繪製像素並忘記文字。大多數終端仿真器不提供任何類似的功能。

¹實際上,大多數檔案都是這樣的,但並非全部。目錄無法透過普通介面寫入,並且在許多 UNIX 變體上也無法讀取。有些設備不支援讀取或寫入,僅支援ioctl.

答案2

是的,但是終端文件不是常規文件。

如果列出終端檔案的擴充屬性,您將看到:

$ ls /dev/tty1 -lah
crw--w---- 1 root tty 4, 0 Apr  6 13:07 /dev/tty1

注意權限部分的第一個字元是字母“c”,這表示該檔案是字元特殊裝置。相反,常規檔案包含“-”,目錄為“d”,區塊特殊裝置為“b”,符號連結為“l”,unix 網域套接字為“s”。

需要注意的是,在像Linux 這樣的Unix 系統中,檔案系統實際上更像是與核心物件互動的命名空間,您可以在其中為各種核心物件命名,以便系統的各個部分可以明確地引用它們。這些核心物件不僅僅是由持久性儲存支援的常規文件,而且還包括硬體設備或套接字等。

字元特殊設備是一個內核對象,透過讀取和寫入字元流與用戶空間交互,它們可以透過執行以下操作來存取:read()write()系統調用。

例如,在我的機器上使用 Ctrl+Alt+F1(在我的機器上是 /dev/tty1,而不是 tty0),我可以使用使用系統呼叫的程式讀取輸入到虛擬控制台的任何內容,read()例如cat

  1. 在圖形模擬器中,sudo cat /dev/tty1
  2. 使用 Ctrl+Alt+F1 切換到虛擬控制台模擬器
  3. 在虛擬控制台模擬器中輸入一些內容
  4. 使用 Ctrl+Alt+F7 切換回圖形 UI
  5. 在圖形模擬器中,我會看到在虛擬控制台模擬器中輸入的任何內容作為輸出cat

相反,我還可以使用使用write()系統調用的程式在虛擬控制台中顯示字符,例如tee

  1. 在圖形模擬器中,echo "hello world" | sudo tee /dev/tty1
  2. 使用 Ctrl+Alt+F1 切換到虛擬控制台模擬器
  3. 在虛擬控制台模擬器中,我會看到“hello world”

大多數常規文字編輯器將拒絕實際開啟非常規特殊文件,因為它們被編程為檢查文件類型並拒絕編輯非常規文件。這是為了防止“意外”,因為在常規文字編輯器中編輯特殊設備沒有什麼意義。此外,大多數常規文字編輯器實際上並非只是呼叫write()現有文件,而是寫入新文件和rename()交換文件以取代舊文件。即使您有支援就地寫入的文字編輯器,它們通常也會先嘗試截斷文件,這當然在特殊字元裝置中不受支援。

答案3

1970 年代,我們有了硬體終端 CUI。

但在 70 年代沒有人使用 CUI 這個術語。

現在,在我的 Linux 盒子中,我看到七個終端機模擬器,其中 GUI 佔據了第 7 個終端模擬器 (Ctrl+Alt+F7)。

這些終端仿真器在 80 年代就已經可用,而且還沒有 GUI。

使用某些編輯器,此終端檔案 /dev/tty0 是否可以在使用者空間中存取?

這個問題沒有意義。根據設計,所有文件都可以在用戶空間中訪問,這就是文件的全部要點,尤其是/dev./dev/tty0作為一種設備,它無法被編輯,因為它的“內容”本質上是短暫的。您從中讀取的內容就是您最終在控制台中鍵入的內容,並且您在控制台上寫入的內容將顯示在螢幕上。

答案4

是的,您當然可以像 UNIX 中的任何裝置一樣將任何 TTY 作為檔案存取。我會將這個問題標記為可能重複的問題答案很好地解釋了在類似情況下如何做您所要求的事情。

總結一下這個答案的內容,您可以使用 echo 和 cat 與其他 TTY 進行交互,就像處理任何其他文件一樣。打開文件時看不到任何內容的原因是像許多特殊文件一樣,只有新資料可用。

相關內容