主設備看起來就像驅動程序的標準終端嗎?
從 Linux 程式介面
偽終端的關鍵在於從設備看起來就像一個標準終端。所有可以應用於終端設備的操作也可以應用於偽終端從設備。其中一些操作對偽終端沒有意義(例如,設置終端線速度或奇偶校驗),但沒關係,因為偽終端從機默默地忽略它們。
從設備對面向終端的程序來說就像一個標準終端。此外,對於面向終端的程序的程序,它就像一個控制終端。
主設備看起來就像驅動程序的標準終端嗎?如果是,像控制終端一樣?如果不是,類似於設備文件或正常文件,但不一定是終端的設備文件?
謝謝。
主設備看起來像一個終端設備文件,具有可通過
tcgetattr()
/tcsetattr()
/&c 訪問的線路規程。和一個成功的結果isatty()
。事實上,它與從設備是同一個線路規程實例,這就是主端程序將視窗大小變化等資訊傳遞給從端程序的方式。這也是主控端程序如何通過將線路速度設置為零來發出(模擬的)調製解調器掛斷信號的方式,從而觸發線路規程的掛斷機制。(因此文中關於線速度的說法是不正確的。存線上速度有意義的情況。)區別在於讀/寫 I/O。讀取的是字元序列,對於真正的終端,將通過實際的底層串列設備發送。寫入的是字元序列,對於真正的終端,由實際的底層串列設備接收。換句話說:它是規範/非規範輸入和輸出處理的另一面。
這很複雜,即數據包模式和遠端模式。後者早已被淘汰,甚至在本世紀初也不存在於大多數作業系統中,因此需要對 Daniel J. Bernstein 的舊 pty 工具進行修補。前者對於大多數任務並不是特別有用,因此我不會在這個答案中詳細介紹它。
主設備一般不是主端程序執行的會話的控制終端。這將在概念上將類似於真實終端內部的東西放在錯誤的位置。此類會話的控制終端(如果有的話)是另一個終端。
對於諸如
script
NeoVIM:terminal
、emacs 和ptybandage
(如果不是管道的一部分)這樣的程序將是這種情況,它們直接呈現到另一個終端設備並在由該終端設備控制的互動式會話中執行。對於 SSH 伺服器、GUI 終端仿真器、
console-terminal-emulator
來自 nosh 工具集ptyrun
(正常使用)或單片幀緩衝區終端仿真器(如 zhcon)來說,情況並非如此。這些正在渲染到各種不同的 I/O 設備,從文件系統中的緩衝區和 FIFO(在console-terminal-emulator
通過 TCP 套接字的情況下)到幀緩衝區和 HID 類設備,這些設備都不是終端。此外,console-terminal-emulator
SSH 伺服器和幀緩衝終端仿真器通常在守護程序上下文中呼叫,當然會話開始時沒有控制終端。請注意,該圖不是確定的。主端程序不一定會分叉從端程序。以nosh-toolset使用者空間虛擬終端為例,slave端程序是普通
ttylogin@*
服務,由服務管理器fork出來,master端的emulator程序與主端的login session程序沒有直接的程序關係奴隸一方。但這超出了這個答案的範圍。進一步閱讀
- https://unix.stackexchange.com/a/177209/5132
- https://unix.stackexchange.com/a/249801/5132
- 喬納森·德博因·波拉德 (2018)。“使用者空間虛擬終端”。 小吃指南。1.38。點心。JdeBP 的軟體。
- 喬納森·德博因·波拉德 (2018)。快速瀏覽使用者空間虛擬終端 nosh。JdeBP 的軟體。