Linux的tty设备介绍
本文轉載于:對于Linux內核tty設備的一點理解
目錄
前言
一、終端按照其自身能力分類
二、linux系統(tǒng)的終端設備
1、 控制臺
2、 偽終端pty(pseudo-tty)
3、 串口終端(/dev/ttySn)
4、 其它類型終端
三、內核文檔翻譯
四、對于TTY系統(tǒng)的理解(圖解)
前言
tty一詞源于Teletypes,或Teletypewriters,它是最早出現(xiàn)的一種終端設備,類似電傳打字機,由Teletype公司生產(chǎn)。最初tty是指連接到Unix系統(tǒng)上的物理或者虛擬終端。終端是一種字符型設備,通常使用tty來統(tǒng)稱各種類型的終端設備。隨著時間的推移,當通過串行口能夠建立起終端連接后,這個名字也用來指任何的串口設備。它還有多種類,例如串口(ttySn、ttySACn、ttyOn)、USB到串口的轉換器(ttyUSBn),還有需要特殊處理才能正常工作的調制解調器(比如傳統(tǒng)的WinModem類設備)等。tty虛擬設備支持虛擬控制臺,它能通過鍵盤及網(wǎng)絡連接或者通過xterm會話登錄到計算機上。
? ? ?對此還可以結合內核啟動代碼中init進程打開/dev/console和執(zhí)行兩次sys_dup(0),以及標準輸入、標準輸出、標準出錯,還有就是進程fork后的標準輸入輸出的復制情況來一起理解。
?
?而個人計算機只有控制臺,沒有終端。當然愿意的話,可以在串口上連一兩臺字符啞終端。但是linux按POSIX標準把個人計算機當成小型機來用,在控制臺上通過getty軟件虛擬了六個字符啞終端(或者叫虛擬控制臺終端tty1-tty6)(數(shù)量可以在/etc/inittab里自己調整)和一個圖型終端, 在虛擬圖形終端中又可以通過軟件(如rxvt)再虛擬無限多個偽終端(pts/0等)。但這全是虛擬的,雖然用起來一樣,但實際上沒有物理實體。所以在個人計算機上,只有一個實際的控制臺,沒有終端,所有終端都是在控制臺上用軟件模擬的。要把個人計算機當主機再通過串口或網(wǎng)卡外連真正的物理終端也可以,論成本,誰會怎么做呢。
一、終端按照其自身能力分類
1、啞終端(瘦客戶端)
早期的計算機終端是通過串行RS-232通信的,它只能解釋有限數(shù)量的控制碼(CR,LF等),但沒有能力處理執(zhí)行特殊的轉義序列功能(如清行、清屏或控制光標的位置)。簡單來說就是處理能力有限的終端機,他們一般基本上只具有和機械電傳打字機類似的有限功能。這種類型的終端稱為啞終端。現(xiàn)在仍然在現(xiàn)代類Unix系統(tǒng)上得到支持,通過設置環(huán)境變量TERM=dumb。啞終端有時用來指任何類型的通過RS-232連接的傳統(tǒng)計算機終端,不對數(shù)據(jù)進行本地處理或本地執(zhí)行用戶程序的串行通信終端。啞終端有時也指功能有限,只有單色文本處理能力或直接傳輸每一個鍵入的字符而不等待主機輪詢的公共計算機終端。
2、智能終端(胖客戶端)
智能終端就是有能力處理轉義序列,也就是說處理能力較強的終端機。
二、linux系統(tǒng)的終端設備
Linux系統(tǒng)的終端設備一般有以下幾種:
-
1、 控制臺
?
- 系統(tǒng)控制臺/dev/console
/dev/console是系統(tǒng)控制臺,是與操作系統(tǒng)交互的設備。系統(tǒng)所產(chǎn)生的信息會發(fā)送到該設備上。平時我們看到的PC只有一個屏幕和鍵盤,它其實就是控制臺。目前只有在單用戶模式下,才允許用戶登錄控制臺/dev/console。(可以在單用戶模式下輸入tty命令進行確認)。
console有緩沖的概念,為內核提供打印輸出。內核把要打印的內容裝入緩沖區(qū)__log_buff,然后由console來決定打印到哪里(比如是tty0還是ttySn等)。console指向激活的終端。歷史上,console指主機本身的屏幕和鍵盤,而tty指用電纜鏈接的其它位置的控制臺。某些情況下console和tty0是一致的,就是當前所使用的是虛擬終端,也是激活虛擬終端。所以有些資料中稱/dev/console是到/dev/tty0的符號鏈接,但是這樣說現(xiàn)在看來是不對的:根據(jù)內核文檔,在2.1.71之前,/dev/console根據(jù)不同系統(tǒng)設定,符號鏈接到/dev/tty0或者其他tty*上,在2.1.71版本之后則完全由內核代碼內部控制它的映射。?
如果一個終端設備要實現(xiàn)console功能,必須向內核注冊一個struct console結構,一般的串口驅動中都會有。如果設備要實現(xiàn)tty功能,必須要內核的tty子系統(tǒng)注冊一個struct tty_driver結構,注冊函數(shù)在drivers/tty/tty_io.c中。一個設備可以同時實現(xiàn)console和tty_driver,一般串口都這么做。
?
- 當前控制臺: /dev/tty
?
這是應用程序中的概念,如果當前進程有控制終端(Controlling Terminal),那么/dev/tty就是當前進程控制臺的設備文件。對于你登錄的shell,/dev/tty就是你使用的控制臺,設備號是(5,0)。不過它并不指任何物理意義上的控制臺,/dev/tty會映射到當前設備(使用命令“tty”可以查看它具體對應哪個實際物理控制臺設備)。輸出到/dev/tty的內容只會顯示在當前工作終端上(無論是登錄在ttyn中還是pty中)。你如果在控制臺界面下(即字符界面下)那么dev/tty就是映射到dev/tty1-6之間的一個(取決于你當前的控制臺號),但是如果你現(xiàn)在是在圖形界面(Xwindows),那么你會發(fā)現(xiàn)現(xiàn)在的/dev/tty映射到的是/dev/pts的偽終端上。/dev/tty有些類似于到實際所使用終端設備的一個聯(lián)接。
你可以輸入命令 “tty",將顯示當前映射終端如:/dev/tty1或者/dev/pts/0等。也可以使用命令“ps -ax”來查看其他進程與哪個控制終端相連。
在當前終端中輸入 echo “tekkaman” > /dev/tty ,都會直接顯示在當前的終端中。
虛擬控制臺 /dev/ttyn
/dev/ttyn是進程虛擬控制臺,他們共享同一個真實的物理控制臺。
如果在進程里打開一個這樣的文件且該文件不是其他進程的控制臺時,那該文件就是這個進程的控制臺。進程printf數(shù)據(jù)會輸出到這里。在PC上,用戶可以使用alt+Fn切換控制臺,看起來感覺存在多個屏幕,這種虛擬控制臺對應tty1~n,其中 :
/dev/tty1等代表第一個虛擬控制臺
例如當使用ALT+F2進行切換時,系統(tǒng)的虛擬控制臺為/dev/tty2 ,當前控制臺(/dev/tty)則指向/dev/tty2
在UNIX系統(tǒng)中,計算機顯示器通常被稱為控制臺(Console)。它仿真了類型為Linux的一種終端,并且有一些設備特殊文件與之相關聯(lián):tty0、tty1、tty2等。當你在控制臺上登錄時,使用的是tty1。使用Alt+[F1—F6]組合鍵時,我們就可以切換到tty2、tty3等上面去。
你可以登錄到不同的虛擬控制臺上去,因而可以讓系統(tǒng)同時有幾個不同的會話存在。
而比較特殊的是/dev/tty0,他代表當前虛擬控制臺,是當前所使用虛擬控制臺的一個別名。因此不管當前正在使用哪個虛擬控制臺(注意:這里是虛擬控制臺,不包括偽終端),系統(tǒng)信息都會發(fā)送到/dev/tty0上。只有系統(tǒng)或超級用戶root可以向/dev/tty0進行寫操作。tty0是系統(tǒng)自動打開的,但不用于用戶登錄。在Framebuffer設備沒有啟用的系統(tǒng)中,可以使用/dev/tty0訪問顯卡。
?
-
2、 偽終端pty(pseudo-tty)
?
? ? ? ? 偽終端(Pseudo Terminal)是終端的發(fā)展,為滿足現(xiàn)在需求(比如網(wǎng)絡登陸、xwindow窗口的管理)。它是成對出現(xiàn)的邏輯終端設備(即master和slave設備, 對master的操作會反映到slave上)。它多用于模擬終端程序,是遠程登陸(telnet、ssh、xterm等)后創(chuàng)建的控制臺設備。
歷史上,有兩套偽終端軟件接口:
BSD接口:較簡單,master為/dev/pty[p-za-e][0-9a-f] ;slave為?/dev/tty[p-za-e][0-9a-f] ,它們都是配對的出現(xiàn)的。例如/dev/ptyp3和/dev/ttyp3。但由于在編程時要找到一個合適的終端需要逐個嘗試,所以逐漸被放棄。
Unix 98接口:使用一個/dev/ptmx作為master設備,在每次打開操作時會得到一個master設備fd,并在/dev/pts/目錄下得到一個slave設備(如?/dev/pts/3和/dev/ptmx),這樣就避免了逐個嘗試的麻煩。由于可能有好幾千個用戶登陸,所以/dev/pts/*是動態(tài)生成的,不象其他設備文件是構建系統(tǒng)時就已經(jīng)產(chǎn)生的硬盤節(jié)點(如果未使用devfs、udev、mdev等) 。第一個用戶登陸,設備文件為/dev/pts/0,第二個為/dev/pts/1,以此類推。它們并不與實際物理設備直接相關。現(xiàn)在大多數(shù)系統(tǒng)是通過此接口實現(xiàn)pty。
?
? ? ? ?我們在X Window下打開的終端或使用telnet 或ssh等方式登錄Linux主機,此時均通過pty設備。例如,如果某人在網(wǎng)上使用telnet程序連接到你的計算機上,則telnet程序就可能會打開/dev/ptmx設備獲取一個fd。此時一個getty程序就應該運行在對應的/dev/pts/*上。當telnet從遠端獲取了一個字符時,該字符就會通過ptmx、pts/*傳遞給 getty程序,而getty程序就會通過pts/*、ptmx和telnet程序往網(wǎng)絡上返回“l(fā)ogin:”字符串信息。這樣,登錄程序與telnet程序就通過“偽終端”進行通信。
?
? ? ?如果一個程序把?pts/*看作是一個串行端口設備,則它對該端口的讀/寫操作會反映在該邏輯終端設備對的另一個/dev/ptmx上,而/dev/ptmx則是另一個程序用于讀寫操作的邏輯設備。這樣,兩個程序就可以通過這種邏輯設備進行互相交流,這很象是邏輯設備對之間的管道操作。對于pts/*,任何設計成使用一個串行端口設備的程序都可以使用該邏輯設備。但對于使用/dev/ptmx的程序,則需要專門設計來使用/dev/ptmx邏輯設備。
? ? ? ?通過使用適當?shù)能浖?#xff0c;就可以把兩個甚至多個偽終端設備連接到同一個物理串行端
-
3、 串口終端(/dev/ttySn)
? ? ? ? 串行端口終端(Serial Port Terminal)是使用計算機串行端口連接的終端設備。計算機把每個串行端口都看作是一個字符設備。有段時間串行端口設備通常被稱為終端設備,那時它的最大用途就是用來連接終端,所以這些串行端口所對應的設備名稱是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev /ttyS1)等,設備號分別是(4,0)、(4,1)等(對應于win系統(tǒng)下的COM1、COM2等)。若要向一個端口發(fā)送數(shù)據(jù),可以在命令行上把標準輸出重定向到這些特殊文件名上即可。
? ? ? ?例如,在命令行提示符下鍵入:echo tekkaman> /dev/ttyS1會把“tekkaman”發(fā)送到連接在ttyS1(COM2)端口的設備上。
? ? ???在2.6以后的內核中,部分三星芯片(例如S3C24x0等)將串口終端設備節(jié)點命名為ttySACn。TI的Omap系列芯片從2.6.37開始芯片自帶的UART設備開始使用專有的的omap-uart驅動,故設備節(jié)點命名為ttyOn,以區(qū)別于使用8250驅動時的設備名“ttySn”。
?
-
4、 其它類型終端
還針對很多不同的字符設備存在有很多其它種類的終端設備特殊文件,例如針對ISDN設備的/dev/ttyIn終端設備等。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
三、內核文檔翻譯
其實在理解以上概念的時候,如果了解終端的發(fā)展歷程,就可以比較容易理解tty、終端的概念。所以請大家閱讀最后推薦的wiki英文網(wǎng)頁,有助于理解上面的概念。當然,內核文檔也是必不可少的參考資料,我順手翻譯了一下。
內核文檔/Documentation/devices.txt翻譯節(jié)選:
**** 終端設備
Terminal, or TTY devices are a special class of character devices. A
terminal device is any device that could act as a controlling terminal
for a session; this includes virtual consoles, serial ports, and
pseudoterminals .
終端或這TTY設備是一類特殊的字符設備。
一個終端設備是任何對于一個會話可以作為控制終端的設備。
這包括虛擬控制臺、串口和偽終端(PTYs)。
All terminal devices share a common set of capabilities known as line
disciplines; these include the common terminal line discipline as well
as SLIP and PPP modes.
所有終端設備共享一系列常規(guī)能力-線路規(guī)程。
這包含常見的終端線路規(guī)程,例如SLIP和PPP模式。
All terminal devices are named similarly; this section explains the
naming and use of the various types of TTYs. Note that the naming
conventions include several historical warts; some of these are
Linux-specific, some were inherited from other systems, and some
reflect Linux outgrowing a borrowed convention.
所有終端設備的命名都比較簡單。本節(jié)介紹不同類型TTY的命名和用途。
注意命名的約定包含了一些歷史需求:
某些是Linux特定的,
某些是從其他的系統(tǒng)中繼承下來的,
還有一些則反映了Linux從借鑒來的約定中發(fā)展而來的。
A hash mark (#) in a device name is used here to indicate a decimal
number without leading zeroes.
設備名中的(#)標志用于標識一個不以0開頭的10進制數(shù)。
Virtual consoles and the console device
虛擬控制臺和控制臺設備
Virtual consoles are full-screen terminal displays on the system video
monitor. Virtual consoles are named /dev/tty#, with numbering
starting at /dev/tty1; /dev/tty0 is the current virtual console.
/dev/tty0 is the device that should be used to access the system video
card on those architectures for which the frame buffer devices
(/dev/fb*) are not applicable. Do not use /dev/console
for this purpose.
虛擬控制臺是在系統(tǒng)視頻監(jiān)視器上全屏的顯示終端。
虛擬控制臺設備名為/dev/tty#,編號開始于/dev/tty1。
/dev/tty0是當前虛擬控制臺。
/dev/tty0在那些幀緩沖設備(/dev/fb*)不適用的構架下可以被用來訪問系統(tǒng)顯卡。
而/dev/console并不用于此目的。
The console device, /dev/console, is the device to which system
messages should be sent, and on which logins should be permitted in
single-user mode. Starting with Linux 2.1.71, /dev/console is managed
by the kernel; for previous versions it should be a symbolic link to
either /dev/tty0, a specific virtual console such as /dev/tty1, or to
a serial port primary (tty*, not cu*) device, depending on the
configuration of the system.
控制臺設備/dev/console是一個接受系統(tǒng)信息并在單用戶模式下允許登錄的設備。
從Linux 2.1.71開始,/dev/console由內核管理,
而以前的版本是一個到/dev/tty0、一個特定的虛擬控制臺(如/dev/tty1)或者一個串口主(tty*,非cu*)設備動態(tài)鏈接,這些依賴系統(tǒng)配置。
Serial ports
串行端口
Serial ports are RS-232 serial ports and any device which simulates
one, either in hardware (such as internal modems) or in software (such
as the ISDN driver.) Under Linux, each serial ports has two device
names, the primary or callin device and the alternate or callout one.
Each kind of device is indicated by a different letter. For any
letter X, the names of the devices are /dev/ttyX# and /dev/cux#,
respectively; for historical reasons, /dev/ttyS# and /dev/ttyC#
correspond to /dev/cua# and /dev/cub#. In the future, it should be
expected that multiple letters will be used; all letters will be upper
case for the "tty" device (e.g. /dev/ttyDP#) and lower case for the
"cu" device (e.g. /dev/cudp#).
The names /dev/ttyQ# and /dev/cuq# are reserved for local use.
名字(/dev/ttyQ#和/dev/cuq#)保留,用于本地使用。
The alternate devices provide for kernel-based exclusion and somewhat
different defaults than the primary devices. Their main purpose is to
allow the use of serial ports with programs with no inherent or broken
support for serial ports. Their use is deprecated, and they may be
removed from a future version of Linux.
備用設備提供基于內核的exclusion和某些與主要設備不同的默認配置。他們的主要目的是允許那些對于串口并非內部支持或是有一定問題的程序使用串口。他們的使用已經(jīng)過時,他們可能會從未來的Linux版本中刪除。
Arbitration of serial ports is provided by the use of lock files with
the names /var/lock/LCK..ttyX#. The contents of the lock file should
be the PID of the locking process as an ASCII number.
串口的仲裁是通過鎖文件(/var/lock/LCK..ttyX#)來提供的。
鎖文件的內容應該是鎖定進程PID的ASCII碼。
It is common practice to install links such as /dev/modem
which point to serial ports. In order to ensure proper locking in the
presence of these links, it is recommended that software chase
symlinks and lock all possible names; additionally, it is recommended
that a lock file be installed with the corresponding alternate
device. In order to avoid deadlocks, it is recommended that the locks
are acquired in the following order, and released in the reverse:
安裝一個例如/dev/modem的鏈接來指向串口是常見的做法。
為了確保適當鎖定在這些環(huán)節(jié)的存在,建議軟件追蹤符號并鎖定所有可能的名字;
此外,建議為相應的備用設備安裝一個鎖文件。
為了避免死鎖,建議按以下順序獲取鎖,并按反向的順序釋放:
1. The symbolic link name, if any (/var/lock/LCK..modem)
2. The "tty" name (/var/lock/LCK..ttyS2)
3. The alternate device name (/var/lock/LCK..cua2)
1、符號鏈接名,如果有(/var/lock/LCK..modem)
2、“tty”名(/var/lock/LCK..ttyS2)
3、備用設備名(/var/lock/LCK..cua2)
In the case of nested symbolic links, the lock files should be
installed in the order the symlinks are resolved.
在符號鏈接嵌套的情況下,鎖定文件應按照符號鏈接的順序來安裝以解決問題。
Under no circumstances should an application hold a lock while waiting
for another to be released. In addition, applications which attempt
to create lock files for the corresponding alternate device names
should take into account the possibility of being used on a non-serial
port TTY, for which no alternate device would exist.
在任何情況下,應用程序應該等待另一個程序釋放鎖后,持有這個鎖。
此外,試圖為相應的備用設備名創(chuàng)建鎖文件的應用程序應考慮被用于非串口的TTY端口的可能性,此時沒有備用設備存在。
Pseudoterminals (PTYs)
偽終端(PTYs)
Pseudoterminals, or PTYs, are used to create login sessions or provide
other capabilities requiring a TTY line discipline (including SLIP or
PPP capability) to arbitrary data-generation processes. Each PTY has
a master side, named /dev/pty[p-za-e][0-9a-f], and a slave side, named
/dev/tty[p-za-e][0-9a-f]. The kernel arbitrates the use of PTYs by
allowing each master side to be opened only once.
偽終端(或PTYs)用于創(chuàng)建登錄會話或提供給其他需要tty線路規(guī)程(包括SLIP或PPP能力)能力以生成數(shù)據(jù)的進程。
每個PTY有一個主端(/dev/pty[p-za-e][0-9a-f])和一個從端(/dev/tty[p-za-e][0-9a-f])。
內核通過只允許每個主端僅允許打開一次來仲裁PTY的使用。
Once the master side has been opened, the corresponding slave device
can be used in the same manner as any TTY device. The master and
slave devices are connected by the kernel, generating the equivalent
of a bidirectional pipe with TTY capabilities.
一旦主端被打開,相應的從設備可以像任何TTY設備一樣的方式被使用。
主從設備都和內核連接,產(chǎn)生相當于一個帶TTY功能的雙向管道。
Recent versions of the Linux kernels and GNU libc contain support for
the System V/Unix98 naming scheme for PTYs, which assigns a common
device, /dev/ptmx, to all the masters (opening it will automatically
give you a previously unassigned PTY) and a subdirectory, /dev/pts,
for the slaves; the slaves are named with decimal integers (/dev/pts/#
in our notation). This removes the problem of exhausting the
namespace and enables the kernel to automatically create the device
nodes for the slaves on demand using the "devpts" filesystem.
Linux內核的最近版本和GNU庫包含了對于System V和Unix98對PTY命名方式的支持。
它分配一個共用的設備(/dev/ptmx)給所有的主端(打開它會自動給你一個以前未分配的PTY)和一個子目錄(/dev/pts)用于從端;從端通過十進制整數(shù)(/dev/pts/#)命名。
這消除了命名空間枯竭的問題,并使內核通過“devpts”文件系統(tǒng)按需自動為從端動創(chuàng)建設備節(jié)點。
四、對于TTY系統(tǒng)的理解(圖解)
?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
推薦閱讀:《Linux C編程一站式學習》----第 34 章 終端、作業(yè)控制與守護進程---1. 終端
wiki百科關于終端的網(wǎng)頁:Computer terminal?|?System console?|?Linux console
?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以上是我參考了網(wǎng)上的資料后對tty的認識整理,參考資料如下:
linux tty pty pts 概念 區(qū)別
終端 /dev/console /dev/tty tty
終端tty、虛擬控制臺、FrameBuffer的切換過程詳解
LINUX下的tty,console與串口分析
linux下tty,控制臺,虛擬終端,串口,console(控制臺終端)詳解
LINXU下的TTY、CONSOLE、串口
Linux下的console和terminal
總結
以上是生活随笔為你收集整理的Linux的tty设备介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: /proc/irq和/proc/inte
- 下一篇: Linux小工具(3)之/proc目录详