Linux中的tty、pts、pty等概念辨析
基本概念
tty、pty、pts、ptmx
- tty(終端設備的統稱):tty一詞源于Teletypes,或teletypewriters,原來指的是電傳打字機,是通過串行線用打印機鍵盤通過閱讀和發送信息的東西,后來這東西被鍵盤和顯示器取代,所以現在叫終端比較合適。終端是一種字符型設備,他有多種類型,通常使用tty來簡稱各種類型的終端設備。
- pty(虛擬終端):
但是假如我們遠程telnet到主機或使用xterm時不也需要一個終端交互么?是的,這就是虛擬終端pty(pseudo-tty) - pts/ptmx(pts/ptmx結合使用,進而實現pty):
pts(pseudo-terminal slave)是pty的實現方法,和ptmx(pseudo-terminal master)配合使用實現pty。
tty[n]和ttyS[n]
-
tty[n] 一般是和物理的控制臺或物理的終端設備相聯系。例如在linux下tty1-6是控制臺下的六個虛擬終端,控制臺是指直接聯系到主機的顯示器+鍵盤/鼠標。通常我們在linux下看到的控制臺(console)是由幾個設備完成的。分別是
/dev/tty[N]
(其中tty0
就是/dev/console
,而tty1
,tty2
就是不同的虛擬終端(virtual console)).通常使用熱鍵Alt+F[n]
(如Alt+F2
)來在這些虛擬終端之間進行切換。所有的這些tty設備都是由linux/drivers/char/console.c
和vt.c
對應。 -
ttyS[n] 是串行端口終端(Serial PortTerminal)是使用電腦串行端口連接的終端設備。電腦把每個串行端口都看作是個字符設備。有段時間這些串行端口設備通常被稱為終端設備,因為那時他的最大用途就是用來連接終端。ttyS1和ttyS2是第一個和第二個串口終端,即通過串行口連接的終端設備。但實際上今天真正的串行終端硬件幾乎見不到了,通常可以用windows下的超級終端程序和linux下的minicom這樣的模擬終端程序來模擬它。甚至ttyUSB0這樣的USB-串口轉換器的模擬串口也出現了。所以tty現在也不全是物理的設備了。
使用pty這樣的虛擬終端設備的主要有兩種:一種是由Xwindow下的模擬終端程序使用的,另一種就是通過網絡遠程登錄上去的終端模擬程序使用的,如putty,SecuCRT之類。甚至你從一臺主機的控制臺tty1上用telnet/ssh登錄了另一臺聯網主機,對于被連接的主機,你使用的仍然是一臺pty——虛擬終端。
總而言之,物理和虛擬的區分已經越來越模糊了,沒必要那么較真。Unix的設計的哲學就是“一切皆文件”,在使用上沒什么分別。像在PLAN9這樣的概念OS中,連網絡服務也都是文件了,更加的大一統了,其實不是挺好的嗎?
/dev/pty、/dev/tty[n]、/dev/console、/dev/pts/[n]、/dev/ptmx
第一個用戶登陸,console的設備文件為/dev/pts/0
,第二個為/dev/pts/1
,以此類推。這里的0、1、2、3不是具體的標準輸入或輸出,而是整個控制臺。你可嘗試 echo "aaaaaa" > /dev/pts0
,這個在后面的實驗部分會展示。
-
/dev/tty
當前控制終端。/dev/tty
指的是當前所處的終端,輸出到此的內容只會顯示在當前工作的終端顯示器上;可以使用命令ps –ax
來查看進程與哪個控制終端相連。對于你登錄的shell,/dev/tty
就是你使用的終端,設備號是(5,0)。使用命令tty
可以查看自己具體對應哪個實際終端設備。/dev/tty
有些類似于到實際所使用終端設備的一個聯接。 -
/dev/console 和 /dev/tty[n]
控制臺終端-系統控制臺 。在Linux系統中,計算機顯示器通常被稱為控制臺終端(Console)。它仿真了類型為Linux的一種終端(TERM=Linux),并且有一些設備特殊文件與之相關聯:tty0、tty1、tty2等.當你在控制臺上登錄時,使用的是tty1。使用Alt+[F1—F6]組合鍵時,我們就可以切換到tty2、tty3等上面去.tty1–tty6等稱為虛擬終端,而tty0則是當前所使用虛擬終端的一個別名,即/dev/console
就是tty0。系統所產生的信息會發送到該終端上。因此不管當前正在使用哪個虛擬終端,系統信息都會發送到控制臺終端上。你可以登錄到不同的虛擬終端上去,因而可以讓系統同時有幾個不同的會話期存在.只有系統或超級用戶root可以向/dev/tty0
進行寫操作。 -
/dev/pts/[n] 和 /dev/ptmx
文件
/dev/ptmx
是一個字符文件,主數字為5,次數字為2,通常為模式0666,所有者組為root.root。它用于創建偽終端主對和從對。當進程打開
/dev/ptmx
時,它將獲得偽終端主設備(PTM)的文件描述符,并在/dev/pts
目錄中創建偽終端從設備(PTS)。通過打開/dev/ptmx
獲得的每個文件描述符都是一個獨立的PTM,具有自己的關聯PTS,可以通過將文件描述符傳遞給ptsname找到其路徑。/dev/pts/[n]
是遠程登陸(telnet,ssh等)后創建的控制臺設備文件所在的目錄。由于可能有好幾千個用戶登陸,所以/dev/pts
其實是動態生成的,不像其他設備文件是構建系統時就已經產生的硬盤節點(如果未使用devfs)。
/dev/tty[n]
的偽終端跟/dev/pts/[n]
的偽終端有什么區別?為什么/dev/tty[n]
可以代表偽終端的情況下,還要分出/dev/pts/[n]
的偽終端呢?邏輯上它們都是終端設備,屬于字符設備的一種,說到不同多半是歷史原因形成的,其實也沒什么大不了的區別。
實驗
tty
命令,可通過手冊查到:
tty - print the file name of the terminal connected to standard input
即打印連接到標準輸入的終端的文件名。
我們在某臺機器下打開一個終端,并執行ls /dev/pt*
來查看設備目錄下的文件:
這時,我們再新開一個終端,并再次執行ls /dev/pt*
和在新終端下執行tty
:
很明顯,我們每次新開一個終端,就會在/dev/pts
目錄下新生成一個設備文件,比如這次我們新生成的就是文件2。當前終端的編號可以通過tty
命令來查看。我們甚至可以在它們之間進行交互,比如我們知道新打開的終端編號為2,那我們可以在原終端上向它輸出信息:
echo "hello" > /dev/pts/2
這時,在新打開的終端/dev/pts/2
上,我們可以看到:
Ref:
https://www.cnblogs.com/zengkefu/p/5558851.html
http://blog.chinaunix.net/uid-17008081-id-2838360.html
https://www.cnblogs.com/zengkefu/p/5558840.html