Linux中的tty和pts

一、幾個基本概念

  • tty(Teletypewriter)
來源於“電傳打印機”,Linux系統中則是終端設備的統稱,同時也代指操作系統中支持終端設備的tty子系統。
 
  • console(控制檯)
計算機的基本輸入輸出設備,通常是與系統直接相連的物理終端,用於系統初始化、內核消息輸出等關鍵操作。
 
  • pty(Pseudo-terminal)
僞終端,模擬了一個終端設備,分爲主設備(ptmx)和從設備(pts)。pty允許在一個程序中創建類似終端的交互環境。
 
  • pts (Pseudo-terminal Slave)
僞終端從設備,是與具體應用程序交互的終端接口。
 
  • ptmx(Pseudo-terminal Master)
僞終端主設備,與pts對應,用於管理和控制與之關聯的pts。
 
Ps. 下文中“計算機”和“服務器”基本表示同一意思,如有差異,則“計算機”偏向於這一設備類別的統稱,而“服務器”則特指高性能的非個人pc設備。
 

二、服務器終端演進歷史

       在計算機出現之前,人們就已經在使用Teletypewriter(電傳打字機)設備來相互傳遞信息。
 
 
       計算機出現後,在早期大型機(mainframe)和小型機(minicomputer)時代,計算機昂貴且巨大,這些笨重的設備通常被安置在單獨的房間內,人們通過某些設備與計算機進行交互, 這種與計算機交互的輸入輸出設備被稱爲終端(Terminal)。
Ken Thompson和Dennis Ritchie在PDP-7前
 
       爲了更充分地利用這些計算機,貝爾實驗室的Ken Thompson和Dennis Ritchie開發了多用戶操作系統UNIX,支持多個用戶同時接入。但是當時的顯示器是非常昂貴的設備,不太可能每個人都有一個顯示器,因此兩個人想出了一個變通的方法,他們選擇了便宜的電傳打字機來做終端設備(輸入終端和顯示終端)。
 
       這裏所使用的電傳打字機就是下圖這個設備ASR33,所以ASR33成了UNIX操作系統層面的第一個終端設備,tty也就成了計算機“終端”的代名詞。
ASR33電傳打印機
 
       因爲終端設備的硬件是多樣的,爲了更好地兼容這些終端設備,操作系統中設計了tty的子系統,這樣計算機就可以通過tty這種抽象驅動結構跟各種各樣的終端設備交互,其通信結構如下。
 
       除了可以外部接入的終端設備,計算機本身一般會集成一個特殊的終端,這個自帶的終端被稱爲控制檯(console)。跟其它外接終端不同,控制檯一般只能被管理員使用,用於系統初始化、內核消息輸出等關鍵操作。
       下圖中計算機上集成的控制面板即爲控制檯。
DPD-7小型機及其控制檯
 
       隨着技術的進步,控制檯、終端這些不再是單獨的設備,而是逐漸被鍵盤和顯示器所整合。
       沒有了專用的硬件終端設備,我們怎麼與那些傳統的、不兼容的圖形接口命令運行程序交互呢?這個時候我們需要一個軟件程序來模擬傳統終端的行爲,即終端模擬器(Terminal Emulator),比如Linux系統中的xterm就是這樣一種終端模擬器。
 
       這樣,鍵盤顯示器直連服務器上的模擬終端的時候,會話模式演變成如下這樣。
 
       在互聯網時代,人們有了遠程使用計算機的需求,個人計算機常常被仿真成一個終端與主機相連,所以更常見的一種模式是,我們使用本地終端,通過ssh遠程連接的方式登錄服務器,其會話模式如下。
 
       我們遠程接入服務器後,往往會啓動多個shell工作,每個shell都對應一個pts(僞終端從設備),這樣,ptmx+pts就承擔起了tty的角色,是pty的一種具體實現方式。
 

三、一些常用終端相關命令

3.1 toe:列出系統支持的terminal類型

       linux系統中常見的terminal支持類型多達一千多種。
[root@ic-admin2 ~]# toe -a 
... 
gnome-rh90 GNOME Terminal 
... 
linux linux console 
... 
mac Macintosh with MacTerminal 
... 
putty PuTTY terminal emulator 
... 
xfce Xfce Terminal 
... 
xterm xterm terminal emulator (X Window System) 
...
 

3.2 tty:顯示當前終端的tty設備文件路徑

       tty設備文件是位於/dev/pts/下面的一個數字編號文件。
[root@ic-admin2 ~]# tty 
/dev/pts/13
 

3.3 stty:設置和顯示終端設備屬性

[root@ic-admin2 ~]# stty -a 
speed 38400 baud; rows 40; columns 190; line = 0; 
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; 
min = 1; time = 0; 
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts 
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8 
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
 
       裏面很多信息是非常有用的。
rows 40; columns 190; 當前terminal 40行,190列。
start = ^Q; stop = ^S; ctrl+Q開始刷新,ctrl+S停止刷新。
 

3.4 w:顯示登錄用戶信息,包括使用的tty設備及活動時間

[root@ic-admin2 ~]# w 
11:22:51 up 50 days, 23:32, 54 users, load average: 0.35, 0.28, 0.31 
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT 
root tty1 27Mar24 50days 0.06s 0.06s -bash 
root pts/0 n232-134-194 Thu10 17:34m 0.20s 0.06s /usr/bin/sss_ssh_knownhostsproxy -p 22 10.232.130.130 
root pts/1 n232-134-067 28Mar24 55:55 1.05s 1.05s -bash 
root pts/2 n232-135-067 23Apr24 42:59 7.73s 7.73s -bash 
jumpserv pts/5 n232-159-063 09:53 5:15 0.24s 0.07s sshd: 
jumpserver [priv] jumpserv pts/6 n232-159-063 09:57 27:55 0.28s 0.07s sshd: jumpserver [priv] 
...
 

3.5 wall:向當前機器上所有登錄用戶的tty設備發送消息

[root@ic-monitor01 ~]# wall test 

Broadcast message from root@ic-monitor01 (pts/0) (Fri May 17 11:29:31 2024): 

test
 

四、Linux終端概念演示

       下面通過一種典型的應用場景,來了解一下Linux系統中tty和pts相關的概念。
用戶在個人pc上,通過ETX這個軟件,遠程連接到服務器n232-135-066上,打開一個gnome-terminal,通過tty命令查看當前虛擬終端被分配的pts(/dev/pts/509)。
 
       lsof命令可以檢索出當前終端綁定了哪些進程,當前虛擬終端中主要綁定了bash和lsof。
       此時新開一個Tab,可以看到pts從509切換到785,可見每個圖形界面都對應了一個獨立的虛擬終端。
 
       同樣,通過lsof命令也可以看出,兩個虛擬終端是獨立的,都只顯示了自己終端下的綁定進程。
       然後再嘗試通過ssh的方式打開一個新的虛擬終端。
 
       因爲對ic-monitor01來說,此次連接是首個連接,所以其tty爲/etc/pts/0。
       由上可見,Linux中每個獨立界面都對應了唯一個的一個僞終端連接。
 

五、幾個冷知識

5.1 tty和console的區別

       在實體終端時代,tty指的是外置終端設備,主要用戶是普通用戶,具有跟服務器交互的普通權限;console指的是服務器自帶的控制檯,主要用戶是系統管理員,具有內核初始化和消息系統輸出等特殊權限。
暫時無法在飛書文檔外展示此內容
 
       Linux系統中,虛擬終端時代tty跟console的界限逐漸模糊,/dev/console本身就是一個虛擬的tty,映射到真正的tty上來實現其功能。
其它UNIX系統中,兩者仍然有明顯的區別,簡單地說,能直接顯示系統消息的那個終端稱爲控制檯,其它的則稱爲終端。
 

5.2 Linux中\r和\n

       Linux中的一些文本編輯的概念,還來自於打字機時代,比如回車符\r和換行符\n。
       下圖就是上文提到的電傳打字機ASR33。
 
       它的鍵盤字符如下所示。
 
       該打字機每次打印一行,打印一行之後磁頭和紙張接觸的那個地方位於紙張當前行的最右側,磁頭要回到紙張的下一行最左側的地方繼續打印,從上一行最右側移動到下一行最左側這個過程需要耗費0.2秒,這0.2秒內正好可以打兩個字符。如果一行只能打印10個字符,而打字機收到連續20個字符,那麼在打完10個字符之後,換到下一行用去的0.2秒就會導致有2個字符沒打印出來而丟失,最終只有18個字符。
       如何解決這個問題?研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字符。一個叫做"回車",告訴打字機把打印頭定位在左邊界;另一個叫做"換行",告訴打字機把紙向下移一行。這樣剛好用回車和換行這2個無意義字符佔用移動磁頭所需的0.2秒的時間空缺,也即打字機收到22個字符,1-10字符有意義,11-12字符爲回車和換行,13-24字符有意義,在應該打印到11-12字符時,打字機換到下一行最左側,丟掉11-12字符,不會導致信息錯誤。
       早期的打字機(計算機發明之前)似乎還是手動回車和換行,所以上面的圖片能看到"回車"(RE-TURN,第二排最後一個)和"換行"(LINE FEED,第二排倒數第二個)按鍵。後來,計算機發明瞭,這兩個概念也就被搬到了計算機上。
 

5.3 Linux中的ctrl+s和ctrl+q

       Linux系統中,ctrl+s的作用是暫停終端的輸出,trcl+q的作用是恢復被ctrl+s暫停的輸出。
       也許你從來沒有嘗試過這兩個很有意思的冷門功能,你可以用top命令來定時刷新顯示系統負載狀況,然後按下ctrl+s觀察發生了什麼,然後按下ctrl+q再觀察發生了什麼。
       這兩個功能來源於電傳打字機(Teletypewriter)。電傳打印機自帶打印功能,可以在收發報文信息時將字打印在紙上,這個步驟稱爲回顯。由於電傳打印機沒有緩衝,如果發送方太快,接收方可能來不及打印,於是發送方允許接收方回傳兩個控制信號,一個是告訴發送方停止發送,一個是告訴發送方繼續發送,現在這兩個特性仍然被終端模擬器所保留,快捷鍵分別是ctrl+s和ctrl+q。
 

參考文檔

https://www.cnblogs.com/schaepher/p/14461553.html
https://baijiahao.baidu.com/s?id=1672406226465975365&wfr=spider&for=pc
https://segmentfault.com/a/1190000009082089
https://blog.csdn.net/Dontla/article/details/131496149
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章