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