Linux 終端是如何工作的?
如果您啟動一個終端並呼叫一個執行檔(為簡單起見,假設它是面向行的),您會從執行檔中得到對命令的回复。這如何列印給您(使用者)?終端會做類似的事情
pexpect
嗎?(輪詢等待輸出)還是什麼?它如何得到要列印輸出的通知?終端如何啟動程序?(它類似於 python 的 os.fork() 嗎?)我很困惑終端是如何工作的,我一直在玩一些終端模擬器,但我仍然不明白所有這些魔法是如何工作的。我正在查看 konsole (kde) 和 yakuake (可能使用 konsole) 的來源,但我不知道所有這些魔法發生在哪裡。
最初你只有啞終端 - 起初實際上是電傳打字機(類似於電動打字機,但帶有一捲紙)(因此 /dev/tty - TeleTYpers),但後來螢幕+鍵盤組合 - 只是發送一個鍵碼到電腦並且電腦發回在終端上寫信的命令(即終端沒有本地回顯,電腦必須命令終端寫使用者在終端上鍵入的內容) - 這是原因之一為什麼這麼多重要的 Unix 命令都這麼短。大多數終端都通過串列線連接,但(至少)有一個直接連接到電腦(通常是同一個房間)——這是控制台。只有少數使用者被信任在“控制台”上工作(這通常是單使用者模式下唯一可用的“終端”)。
xterm
後來還有一些帶有螢幕和圖形螢幕卡、鍵盤、滑鼠和簡單處理器的圖形終端(所謂的“xterminals”,不要與 -program 混淆);它可以只執行一個 X 伺服器。他們自己不做任何計算,所以 X 客戶端在他們連接的電腦上執行。有些有硬碟,但它們也可以通過網路啟動。它們在 1990 年代初很流行,當時 PC 變得如此便宜和強大。再後來,出現了“智能”或“智能”終端。智能終端無需電腦幫助即可****處理使用者輸入(在 shell 提示符下進行行編輯,例如插入字元、使用 刪除單詞、使用或
Ctrl-W
刪除字母)。另一方面,早期的啞終端無法執行這種現場行編輯。在啞終端上,當使用者按下一個鍵時,終端將生成的鍵碼發送/委託給電腦進行處理。電腦處理後將結果返回啞終端顯示(如按Ctrl-H``Backspace``Ctrl-W
將向電腦發送一個鍵碼,電腦會將其解釋為“刪除最後一個單詞”,因此電腦將處理該文本更改,然後簡單地將其應顯示的輸出提供給啞終端)。一個“終端模擬器”——你用諸如
xterm
或之類的程序打開的“終端視窗”konsole
——試圖模仿這種更智能終端的功能。諸如PuTTY
(Windows) 之類的程序也模擬這些智能終端仿真器。在 PC 上,“控制台”(鍵盤+螢幕)和“電腦”更像是一個單一的單元,您可以使用“虛擬終端”(在 Linux 上,通過 Alt+F1 到 Alt+F6 鍵),但這些也是模仿老式終端。當然,隨著 Unix/Linux 越來越多地成為單個使用者經常使用的桌面作業系統,您現在的大部分工作都是“在控制台”上完成的,使用者之前使用的是通過串列線連接的終端。
當然是啟動程序的外殼。它使用
fork
系統呼叫(C 語言)通過環境設置製作自身的副本,然後使用exec
系統呼叫將此副本轉換為您想要執行的命令。shell 會掛起(除非命令在後台執行),直到命令完成。由於該命令從 shell 繼承了stdin、stdout和stderr的設置,因此該命令將寫入終端螢幕並接收來自終端鍵盤的輸入。
當你“打開一個終端”時,你正在啟動一個終端仿真程序,例如 xterm、gnome-terminal、lxterm、konsole,……
終端模擬器做的第一件事就是分配一個偽終端(通常稱為偽 tty,或簡稱為 pty)。pty 是一對字元設備文件:pty master,它是終端模擬器打開的一面,pty slave,它是在終端內執行的程序打開的一面。在大多數現代 unice 上,主機是
/dev/ptmx
(每個終端仿真器都打開),從機是/dev/pts/NUMBER
. 偽終端的核心驅動程序跟踪哪個程序控制每個從設備的主設備。終端仿真器可以通過主設備上的ioctl檢索到相應從設備的路徑。一旦終端模擬器打開了主設備,它就會啟動一個子程序(通常是一個 shell,但由呼叫終端模擬器的使用者決定)。模擬器以呼叫程序的常用方式執行此操作:
當子程序(或任何其他程序)向 pty slave 寫入數據時,模擬器會看到 pty master 上的輸入。
相反,當仿真器寫入主設備時,它被視為從設備上的輸入。
Expect 的工作方式完全相同。Expect 和終端仿真器(例如 xterm)之間的區別在於,它們在哪裡獲取為程序提供的輸入(腳本與鍵盤輸入)以及它們對輸出的作用(日誌文件或解析器與在視窗中繪製文本)。