探索Linux之 終端模擬器和偽終端互動原理
寫在前面:本人水平有限,很多地方都是自己的理解,如有誤導,歡迎指正
# 終端模擬器指的是在linux桌面環境下執行的模擬終端(如下圖)
# 終端模擬器為啥叫模擬器呢? 因為真正的終端是全屏顯示的黑乎乎的不帶視窗的那種,這裡帶了視窗,是基於linux的X視窗系統上模擬出來的終端裝置,在終端上同樣可以執行shell,和真的終端功能基本無差別
# 偽終端是啥?偽終端是linux核心模擬出來的假的終端裝置對(通過系統呼叫可以動態建立這種假的終端裝置),所謂假的是指這種裝置不和真正的硬體裝置相關聯,只是操作介面和資料解析協議是按照終端裝置規範來的
# 通過系統呼叫建立的偽終端裝置對分為主從兩個裝置,主裝置名為/dev/ptmx ,從裝置名為/dev/pts0、/dev/pts1.../dev/ptsN等,核心允許動態建立無限制個裝置對(所以可以同時開啟許許多多個shell視窗)
# 從主裝置之間的讀寫就像管道,外部程序(模擬器程序)寫主裝置的時候,資料可以從從裝置中讀取出來(shell從stdin讀取命令);程序輸出的資料會寫入從裝置(shell寫stdout、stderr),從裝置的資料又會寫入到主裝置,模擬器程序可以通過讀主裝置來得到程序的輸出(讀取程序的stdout,stderr)
# 通常一個程序預設開啟的stdin stdout stderr檔案就是對應開啟的偽終端從裝置(pts)
# 在桌面應用程式中開啟終端模擬器後,做了如下一些操作:
1 模擬器主程序啟動,在核心中動態建立偽終端裝置對,比如 主裝置/dev/ptmx 從裝置 /dev/pts1
2 模擬器主程序和X伺服器建立連線,建立模擬器視窗,接收和處理從X伺服器發過來的滑鼠和鍵盤事件,把鍵盤事件寫給主裝置ptmx,同時負責讀取ptmx主裝置的輸出,將輸出內容渲染到模擬器視窗上(同樣需要和X伺服器互動)
3 模擬器主程序fork出子程序,將子程序的stdin、stdout、stderr檔案描述符定位到從裝置/dev/pts1,子程序通過exec系統呼叫裝入shell程式(如bash),此時bash正式登場,從終端(從裝置)讀取命令執行,bash完全感覺不到自己是執行在偽終端上的~
# 上面的過程我們可以發現一個問題:每開啟一個終端模擬器就要啟動兩個程序,這是很浪費資源的,實際上通過我分析Ubuntu上的gnome-terminal模擬器發現它做了如下優化處理:把模擬器主程序做成一個本地伺服器,伺服器監聽和處理多個主裝置,同時負責和X伺服器打交道來完成視窗的顯示~ 這樣每次開啟新終端的時候,只會fork出一個新shell程序~
以下為證:
後續還有更多篇對linux終端相關的文章~這篇先到此~