Linux

關於 ptmx 和 pts 的文件

  • September 23, 2018

我想將一個 linux 終端流式傳輸到我自己的程序,據我所知,這是通過打開 /dev/ptmx 來啟動一個新的 pts 來完成的,我已經對此進行了測試,這確實有效(它在/dev/pts)。但我不確定我應該如何實際讀寫這個終端。直接寫入 /dev/pts/(pts number) 我只是得到一個輸入/輸出錯誤。另外,我是否應該使用同一個程序同時打開 /dev/ptmx 和 /dev/pts/(pts number) 。我應該先以某種方式打開一個外殼嗎?

我覺得這些東西有點令人困惑,除了這個手冊頁http://man7.org/linux/man-pages/man4/pts.4.html之外,我找不到太多資訊

這種事情有兩個不同的部分。

  1. 正如您所確定的,您打開偽終端的主端,這將創建一個可以打開的從端設備文件。庫ptsname()函式允許具有打開文件描述符的東西為主端確定此設備名稱。
  2. 同一個或另一個程序,在不同的程序中,打開從屬端,將其完全視為真實終端,登錄子系統將虛擬終端視為:將該程序設置為會話領導者;設置從端為會話的控制端;並將標準輸入、輸出和錯誤設置為從屬端的打開文件描述符。然後它會連結載入任何合適的互動式程序,這實際上可以是一個外殼。

在多個作業系統上,第二部分無法繼續,直到第一部分呼叫了grantpt()unlockpt()庫函式。核心中的互鎖會阻止從屬端可以打開,直到這些在主控端發生。

有趣的是,這些功能(可追溯到 AT&T Unix System 5 第 4 版)已被證明是不必要的。它們是由錯誤的使用者帳戶擁有的從屬設備創建的實現產生的,並且具有錯誤的權限,甚至更舊從端設備是持久字元設備節點的實現(其權限和所有權從上次設置的位置保持不變)並且不是動態創建的,從而導致在各種情況下其他使用者執行的攻擊者程序獲得機會之窗訪問終端。但是現在一些作業系統核心從一開始就只是簡單地給從端設備適當的所有權和權限,從而允許這些功能基本上是無操作的。如今,FreeBSD 和 OpenBSD 都以這種方式工作。不幸的是,儘管多年來核心開發人員多次傳出這種說法,但 Linux 並不是這樣的核心。

第二部分故意含糊不清這是什麼不同的過程。一個常見的架構是主端程序fork()呼叫ptsname(),打開從設備,關閉主端文件描述符。這就是pty-runnosh 工具集中的內容,從中可以建構諸如ptybandageand之類的工具ptyrun。這就是scriptGNU Screen、tmux 和 GUI 終端仿真器(如 XTerm)的工作方式。

但這不是必須的。只要它知道要打開的文件名,從端程序就不需要是fork()主端程序的 ed 子程序。事實上,它不需要任何關於主端的知識,或者終端是偽終端。

例如,在我的使用者空間虛擬終端子系統中,正在執行的程序console-terminal-emulator創建了一個符號連結,其具有指向從設備文件名的已知固定名稱。完全獨立的服務程序使用已知的固定名稱打開從設備,而無需知道核心每次碰巧使用的確切名稱。這些服務程序與附加到核心虛擬終端的類似服務程序的操作相同,並且與附加到真實終端的服務程序基本相同。畢竟,偽終端的從端被設計為像其他兩種終端一樣工作。/dev/pts/*N*

進一步閱讀

引用自:https://unix.stackexchange.com/questions/470717