
根據我所讀到的有關 Linux 中偽終端的內容,偽終端有兩種類型:BSD 風格的偽終端(已棄用)和UNIX 98 偽終端。
我創建了兩個圖像來展示我對這兩種類型的偽終端的理解。
下圖顯示了 BSD 風格的偽終端的工作原理(如果圖像錯誤,請糾正我):
這種類型的偽終端並不難理解,每個終端都連接到一個唯一的主驅動程式。
但在 UNIX 98 偽終端中,事情有點令人困惑。下圖顯示了我認為這種類型的偽終端的工作原理:
所以基本上所有終端都使用相同的主驅動程式(/dev/ptmx
),但我不確定主驅動程式如何知道如何執行以下操作:
如果資料是從終端進程之一發送的,主驅動程式如何知道資料應傳遞給哪個 TTY 從驅動程式?
如果資料從 TTY 從屬驅動程式之一發送,主驅動程式如何知道資料應傳遞到哪個終端進程?
主驅動程式是否知道如何按照我在圖像中所示的方式執行此操作(即主驅動程式有一個映射表,將每個終端 PID 映射到其對應的 TTY 從驅動程式)?
答案1
你對名字非常著迷。/dev/ptmx
不是“驅動程式”,它只是檔案系統中的一個名稱,具有特殊意義。
進程透過呼叫開啟一個新的master pty posix_openpt()
,它傳回一個檔案描述符;open()
調用也可以達到同樣的效果/dev/ptmx
。每次一個進程open()
呼叫/dev/ptmx
一個新的創建偽終端;當沒有更多進程開啟此檔案描述符時,偽終端將被銷毀。該檔案描述符引用偽終端的主端,並且可以像任何其他檔案描述符一樣傳遞給後代程序。
欲了解更多詳細信息,請參閱unix.stackexchange.com/questions/117981。 (向@JdeBP 的建議致敬。)
一旦進程擁有指向偽終端主端的檔案描述符,它就可以透過呼叫 找到偽終端從端的名稱ptsname()
,並可以將此名稱傳遞給它想要透過偽終端控制的任何進程。