天天看點

1.程序間的關系:終端,網絡裝置



1終端

在unix系統中,使用者通過終端登入系統後得到一個shell程序,這個終端成為shell進

程的控制終端(controllingterminal),在講程序時講過,控制終端是儲存在pcb中的信

息,而我們知道fork會複制pcb中的資訊,是以由shell程序啟動的其它程序的控制終端也是這個終端。預設情況下(沒有重定向),每個程序的标準輸入、标準輸出和标準錯誤輸出都指向控制終端,程序從标準輸入讀也就是讀使用者的鍵盤輸入,程序往标準輸出或标準錯誤輸出寫也就是輸出到顯示器上。信号中還講過,在控制終端輸入一些特殊的控制鍵可以給前台程序發信号,例如ctrl-c表示sigint,ctrl-\表示sigquit。

init-->fork-->exec-->getty-->使用者輸入帳号-->login-->輸入密碼-->exec-->shell

檔案與i/o中講過,每個程序都可以通過一個特殊的裝置檔案/dev/tty通路它的控制終

端。事實上每個終端裝置都對應一個不同的裝置檔案,/dev/tty提供了一個通用的接口,一

個程序要通路它的控制終端既可以通過/dev/tty也可以通過該終端裝置所對應的裝置檔案來

通路。ttyname函數可以由檔案描述符查出對應的檔案名,該檔案描述符必須指向一個終端

裝置而不能是任意檔案。下面我們通過實驗看一下各種不同的終端所對應的裝置檔案名。

1.程式間的關系:終端,網絡裝置
1.程式間的關系:終端,網絡裝置

硬體驅動程式負責讀寫實際的硬體裝置,比如從鍵盤讀入字元和把字元輸出到顯示器,

線路規程像一個過濾器,對于某些特殊字元并不是讓它直接通過,而是做特殊處理,比如在

鍵盤上按下ctrl-z,對應的字元并不會被使用者程式的read讀到,而是被線路規程截獲,解釋

1.程式間的關系:終端,網絡裝置

圖:1終端裝置子產品

成sigtstp信号發給前台程序,通常會使該程序停止。線路規程應該過濾哪些字元和做哪些

特殊處理是可以配置的。

2網絡終端

虛拟終端或序列槽終端的數目是有限的,虛拟終端(字元控制終端)一般就是/dev/tty1_/

dev/tty6六個,序列槽終端的數目也不超過序列槽的數目。然而網絡終端或圖形終端視窗的數目

卻是不受限制的,這是通過僞終端(pseudo tty)實作的。一套僞終端由一個主裝置(pty

master)和一個從裝置(pty slave)組成。主裝置在概念上相當于鍵盤和顯示器,隻不過

它不是真正的硬體而是一個核心子產品,操作它的也不是使用者而是另外一個程序。從裝置和上

面介紹的/dev/tty1這樣的終端裝置子產品類似,隻不過它的底層驅動程式不是通路硬體而是

通路主裝置。網絡終端或圖形終端視窗的shell程序以及它啟動的其它程序都會認為自己的

控制終端是僞終端從裝置,例如/dev/pts/0、/dev/pts/1等。下面以telnet為例說明網絡登

錄和使用僞終端的過程。

1.程式間的關系:終端,網絡裝置

圖:2網絡終端

如果telnet用戶端和伺服器之間的網絡延遲較大,我們會觀察到按下一個鍵之後要過幾秒鐘才能回顯到螢幕上。這說明我們每按一個鍵telnet用戶端都會立刻把該字元發送給服務

器,然後這個字元經過僞終端主裝置和從裝置之後被shell程序讀取,同時回顯到僞終端從

裝置,回顯的字元再經過僞終端主裝置、telnetd伺服器和網絡發回給telnet用戶端,顯示

給使用者看。也許你會覺得吃驚,但真的是這樣:每按一個鍵都要在網絡上走個來回!