天天看點

tty指令詳解

 基礎指令學習目錄首頁

原文連結:http://blog.chinaunix.net/uid-9525959-id-2001836.html

[功能] 

列印連接配接到标準輸入的終端的檔案名。 

[描述] 

指令項: 

-s, --silent, --quiet: 什麼也不列印,隻是傳回退出狀态碼。 

--help: 列印幫助資訊。 

--version: 列印版本資訊并退出。 

傳回的狀态碼: 

0 表示标準輸入是一個終端。 

1 表示标準輸入不是一個終端。 

2 表示給定的參數是不正确的參數。 

3 表示發生了寫錯誤。 

[舉例] 

*檢視目前的标準終端檔案描述符号: 

[quietheart@lv-k etc]$ tty 

/dev/pts/6 

這裡,輸入tty之後,輸出"/dev/pts/6"就是目前連接配接的終端對應的檔案描述符号,我們可以通過向這個檔案,這樣會看到目前終端會輸出我們寫入的資料,例如: 

[quietheart@lv-k etc]$ echo "mytest" >/dev/pts/6 

mytest 

可見,向/dev/pts/6檔案寫入的内容,直接顯示到我們的終端上面了。如果我在機器上面開了多個終端,然後我在别的終端中輸入上面的echo指令,那麼将會看到對應"/dev/pts/6"的終端上面會顯示相應的字元了。 

*運作tty什麼也不輸出,然後檢視其退出碼: 

[quietheart@lv-k etc]$ tty -s 

[quietheart@lv-k etc]$ echo $? 

這裡,使用shell的指令"echo $?"來顯示上一條指令的退出狀态碼。狀态碼的含義如下: 

[其它] 

*基本概念: 

1,tty(終端裝置的統稱): 

tty一詞源于Teletypes,或者teletypewriters,原來指的是電傳打字機,是通過串行線用列印機鍵盤通過閱讀和發送資訊的東西,後來這東西被鍵盤與顯示器取代,是以現在叫終端比較合适。終端是一種字元型裝置,它有多種類型,通常使用tty來簡稱各種類型的終端裝置。 

2,pty(虛拟終端): 

如果我們遠端telnet到主機或使用xterm時,也需要一個終端互動,這就是虛拟終端pty(pseudo-tty) 

3,pts/ptmx(pts/ptmx結合使用,進而實作pty): 

pts(pseudo-terminal slave)是pty的實作方法,與ptmx(pseudo-terminal master)配合使用實作pty。 

*Linux終端: 

在Linux系統的裝置特殊檔案目錄/dev/下,終端特殊裝置檔案一般有以下幾種: 

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

串行端口終端(Serial Port Terminal)是使用計算機串行端口連接配接的終端裝置。計算機把每個串行端口都看作是一個字元裝置。有段時間這些串行端口裝置通常被稱為終端裝置,因為那時它的最大用途就是用來連接配接終端。這些串行端口所對應的裝置名稱是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,裝置号分别是(4,0), (4,1)等,分别對應于DOS系統下的COM1、COM2等。若要向一個端口發送資料,可以在指令行上把标準輸出重定向到這些特殊檔案名上即可。例如,在指令行提示符下鍵入:echo test > /dev/ttyS1會把單詞”test”發送到連接配接在ttyS1(COM2)端口的裝置上。可接序列槽來實驗。 

2,僞終端(/dev/pty/) 

僞終端(Pseudo Terminal)是成對的邏輯終端裝置(即master和slave裝置, 對master的操作會反映到slave上)。 

例如/dev/ptyp3和/dev/ttyp3(或者在裝置檔案系統中分别是/dev/pty/m3和 /dev/pty/s3)。它們與實際實體裝置并不直接相關。如果一個程式把ptyp3(master裝置)看作是一個串行端口裝置,則它對該端口的讀/ 寫操作會反映在該邏輯終端裝置對應的另一個ttyp3(slave裝置)上面。而ttyp3則是另一個程式用于讀寫操作的邏輯裝置。 

這樣,兩個程式就可以通過這種邏輯裝置進行互相交流,而其中一個使用ttyp3的程式則認為自己正在與一個串行端口進行通信。這很象是邏輯裝置對之間的管道操作。對于ttyp3(s3),任何設計成使用一個串行端口裝置的程式都可以使用該邏輯裝置。但對于使用ptyp3的程式,則需要專門設計來使用 ptyp3(m3)邏輯裝置。 

例如,如果某人在網上使用telnet程式連接配接到你的計算機上,則telnet程式就可能會開始連接配接到裝置 ptyp2(m2)上(一個僞終端端口上)。此時一個getty程式就應該運作在對應的ttyp2(s2)端口上。當telnet從遠端擷取了一個字元時,該字元就會通過m2、s2傳遞給 getty程式,而getty程式就會通過s2、m2和telnet程式往網絡上傳回”login:”字元串資訊。這樣,登入程式與telnet程式就通過“僞終端”進行通信。通過使用适當的軟體,就可以把兩個甚至多個僞終端裝置連接配接到同一個實體串行端口上。 

在使用裝置檔案系統 (device filesystem)之前,為了得到大量的僞終端裝置特殊檔案,使用了比較複雜的檔案名命名方式。因為隻存在16個ttyp(ttyp0—ttypf) 的裝置檔案,為了得到更多的邏輯裝置對,就使用了象q、r、s等字元來代替p。例如,ttys8和ptys8就是一個僞終端裝置對。不過這種命名方式目前仍然在RedHat等Linux系統中使用着。 

但Linux系統上的Unix98并不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的對應端則會被自動地建立成/dev/pts/3。這樣就可以在需要時提供一個pty僞終端。目錄 /dev/pts是一個類型為devpts的檔案系統,并且可以在被加載檔案系統清單中看到。雖然“檔案”/dev/pts/3看上去是裝置檔案系統中的一項,但其實它完全是一種不同的檔案系統。 

即: TELNET ---> TTYP3(S3: slave) ---> PTYP3(M3: master) ---> GETTY 

*實踐:

以下過程是在ubuntu上面的實踐結果。 

1,虛拟終端/dev/tty*和僞終端/dev/pts/*: 

假設5個xterm終端的話,會發現/dev下面有一個/dev/ptmx /和5個/dev/pts/* 

而如果用"[Ctrl][Alt]F1"進入一個終端的話,就會發現/dev下面多出一個/dev/tty1 

2,檢視終端的方法: 

使用指令"tty"可以檢視目前對應的終端,指令"ps -ax"可以檢視所有程式以及對應的終端。通過這個指令,發現如果多開一個screen程式,或者用telnet登陸之後,那麼機器上面就會多一個/dev/pts/*。可知,一般僞終端使用者模拟終端程式。 

3,向指定終端發送資訊: 

如果運作"echo hello >/dev/tty2", 

那麼"[Ctrl][Alt]F2"打開"/dev/tty2"對應的終端,就會發現剛才發送的hello了。 

注意,如果發送"echo -n ls >/dev/tty2"那麼會顯示ls,但是回車之後,并沒有執行ls。可見:ttyN是代表linux的純指令行終端,而寫到這個終端的字元串隻是做為這個終端的輸出,并沒有當做終端的輸入處理。 

如果運作"echo hello >/dev/pts/2", 

那麼,就可以在xterm的第二個視窗看到hello了。可知,/dev/pts/n是Xwindows模式下的僞終端. 

參考資料: 

http://blog.csdn.net/freeman1975/archive/2009/10/19/4696781.aspx 

"info tty" 

"man tty