Linux下終端之談

Linux下終端類型詳解

終端簡介:

終端和控制檯都不是個人電腦的概念,而是多人共用的小型中型大型計算機上的概念。一臺主機,連很多終端,終端爲主機提供了人機接口,每個人都通過終端使用主機的資源.。

終端有字符啞終端和圖形終端兩種.

個人計算機上只有控制檯,沒有終端.linux按POSIX標準把個人計算機當成小型機來用,就在控制檯上通過getty軟件虛擬了六個字符啞終端(或者叫控制檯終端tty1-tty6)和一個圖型終端。在虛擬圖形終端中又可以通過軟件(如rxvt)再虛擬無限多個虛擬字符啞終端(pts/0....)。記住,這全是虛擬的,用起來一樣,但實際上並不是。所以在個人計算機上,只有一個實際的控制檯,沒有終端,所有終端都是在控制檯上用軟件模擬的。

終端類型:

tty控制終端(終端設備的統稱)

 

控制檯終端:

console: 控制檯終端

    tty#: 控制檯終端下的虛擬終端

  

非控制檯終端:

    ttyS#: 串行端口終端

    pty/#: 僞終端(終端模擬軟件)

    pts#: 圖形終端 X-windows下的僞終端

 

簡單的說,能直接顯示系統消息的那個終端稱爲控制檯,其他的則稱爲終端。但是在linux系統中,這個概念也已經模糊化了。具體區別,請自行百度,餘不一一。

 

串行端口終端(/dev/ttySn)

也被稱爲終端設備,用來連接終端;計算機把每個串行端口都看作是一個字符設備。設備號分別是(4,0)、(4,1)等,分別對應於DOS系統下的COM1、COM2等。

若要向一個端口發送數據,可以在命令行上把標準輸出重定向到這些特殊文件名上即可。例如,在命令行提示符下鍵入:

echo test > /dev/ttyS1

 

控制終端(/dev/tty

如果當前進程有控制終端的話,那麼/dev/tty就是當前進程的控制終端的設備特殊文件(似懂非懂)。它並不指任何物理意義上的終端,/dev/tty會映射到當前的設備,你如果在ttyN控制檯界面下,那麼dev/tty會映射到dev/tty1-6之間當前使用的ttyN界面下,如果你是在圖形界面(Xwindows),那麼/dev/tty映射到圖形界面下打開的終端即/dev/pts之類的僞終端上。

因此,可以說,對於你登錄的shell,/dev/tty就是你當前所在的終端,設備號是(5,0)。/dev/tty有些類似於到實際所使用終端設備的一個聯接。

可以使用命令"ps –ax"來查看進程與哪個控制終端相連。使用命令"tty"可以查看它 具體對應哪個實際終端設備,即tty當前映射到的終端


它並不面對設備,而是面對進程。


控制檯終端(/dev/ttyn,/dev/console )

在Linux系統中,計算機顯示器通常被稱爲控制檯終端(Console).它仿真了類型爲Linux的一種終端(TERM=Linux),並且有一些設備特殊文件與之相關聯:tty0、tty1、tty2等。當你在控制檯上登錄時,使用的是tty1。

 

tty1 –tty6等稱爲虛擬終端,而tty0則是當前所使用虛擬終端的一個別名,系統所產生的信息會發送到該終端上。因此不管當前正在使用哪個虛擬終端,系統信息都會發送到控制檯終端上。你可以登錄到不同的虛擬終端上去,因而可以讓系統同時有幾個不同的會話期存在。只有系統或超級用戶root可以向/dev/tty0進行寫操作.

console是一個緩衝的概念,其實是爲內核提供打印的。我們的pc,終端常用的是顯示器和鍵盤構成,我們用戶打印和內核打印都從這個終端反映給用戶。所以, /dev/console是連接到/dev/tty0的,其實這裏有2個概念,console和tty這2個咚咚,怎麼實現,腦補了一下實現的機制應該是這樣的:

 

其實console這個結構中有個device,這裏其實就是tty0對應的一個虛擬終端設備。如果,我們來個專門打印內核的設備(比如通過串口),我們把那個串口register_console,那麼/dev/console就到這個串口設備了。這時,內核打印就到這個串口設備了,而用戶的打印還是和上面的/dev/tty相關,如果/dev/tty對應/dev/tty0,那麼用戶打印還在窗口中出現。所以說/dev/console是用來外接控制檯的。

 

虛擬終端(/dev/pts)

在Xwindows模式下的僞終端。另有人解釋:每一個遠程連接都會產生一個pts設備。

 

僞終端(/dev/pty/)

僞終端(PseudoTerminal)是成對的邏輯終端設備,包括(/dev/ptyMN)[僞終端主設備]和(/dev/ttyMN)[僞終端從設備],其中,M與N的命名方式如下:

 

    M: p q r s t u v w x y z a b c d e共16

    N: 0 1 2 3 4 5 6 7 8 9 a b c d e f共16

 

 

默認支持最大是256個。

或着:在設備文件系統中分別是/dev/pty/m3和 /dev/pty/s3。

 

它們與實際物理設備並不直接相關。如果一個程序把ptyp3看作是一個串行端口設備,則它對該端口的讀/寫操作會反映在該邏輯終端設備對的另一個上面(ttyp3)。而ttyp3則是另一個程序用於讀寫操作的邏輯設備。這樣,兩個程序就可以通過這種邏輯設備進行互相交流,而其中一個使用ttyp3的程序則認爲自己正在與一個串行端口進行通信。這很象是邏輯設備對之間的管道操作。對於ttyp3(s3),任何設計成使用一個串行端口設備的程序都可以使用該邏輯設備。但對於使用ptyp3的程序,則需要專門設計來使用ptyp3 (m3)邏輯設備。

 

任何寫入到僞終端主設備的輸入,都會作爲僞終端從設備的輸入,反之亦然。類似於管道,如下圖:


 

一個典型的僞終端進程結構如下圖:

 

這張圖的關鍵在於:如果把僞終端從設備想像爲傳統的終端設備,把主設備看成進程讀寫數據的一個“接口”,那麼它的工作原理,就跟傳統終端一樣了。

 

上述只是一個本地進程,把網絡引入進來,對應到telnetd上面來,應該是下面這個樣子:

 

 

同樣的登錄方式,就變成了這樣:

1、如果某人在網上使用telnet程序連接到本地服務器,則telnetd程序就可能會開始連接到設備ptyp2(m2)上(一個僞終端主設備上)。

2、telnetd產生一個子進程,進行getty程序,其打開一個對應的從設備對應的ttyp2(s2),並設置stdin\stdout\stderr;

3、telnetd通過內核tcp/ip協議棧從遠端獲取了一個字符時,該字符就會通過m2、s2傳遞給getty程序,而getty程序就會通過s2、m2和telnetd程序往網絡上返回”login:”字符串信息;

4、這樣,登錄程序與telnetd程序就通過“僞終端”進行通信;

 

本文參考文章:

linux下tty,控制檯,虛擬終端,串口,console(控制檯終端)詳解


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章