1.进程间的关系:终端,网络设备
1終端
在UNIX系統(tǒng)中,用戶通過(guò)終端登錄系統(tǒng)后得到一個(gè)Shell進(jìn)程,這個(gè)終端成為Shell進(jìn)
程的控制終端(ControllingTerminal),在講進(jìn)程時(shí)講過(guò),控制終端是保存在PCB中的信
息,而我們知道fork會(huì)復(fù)制PCB中的信息,因此由Shell進(jìn)程啟動(dòng)的其它進(jìn)程的控制終端也是這個(gè)終端。默認(rèn)情況下(沒(méi)有重定向),每個(gè)進(jìn)程的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都指向控制終端,進(jìn)程從標(biāo)準(zhǔn)輸入讀也就是讀用戶的鍵盤(pán)輸入,進(jìn)程往標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤輸出寫(xiě)也就是輸出到顯示器上。信號(hào)中還講過(guò),在控制終端輸入一些特殊的控制鍵可以給前臺(tái)進(jìn)程發(fā)信號(hào),例如Ctrl-C表示SIGINT,Ctrl-\表示SIGQUIT。
init-->fork-->exec-->getty-->用戶輸入帳號(hào)-->login-->輸入密碼-->exec-->shell
文件與I/O中講過(guò),每個(gè)進(jìn)程都可以通過(guò)一個(gè)特殊的設(shè)備文件/dev/tty訪問(wèn)它的控制終
端。事實(shí)上每個(gè)終端設(shè)備都對(duì)應(yīng)一個(gè)不同的設(shè)備文件,/dev/tty提供了一個(gè)通用的接口,一
個(gè)進(jìn)程要訪問(wèn)它的控制終端既可以通過(guò)/dev/tty也可以通過(guò)該終端設(shè)備所對(duì)應(yīng)的設(shè)備文件來(lái)
訪問(wèn)。ttyname函數(shù)可以由文件描述符查出對(duì)應(yīng)的文件名,該文件描述符必須指向一個(gè)終端
設(shè)備而不能是任意文件。下面我們通過(guò)實(shí)驗(yàn)看一下各種不同的終端所對(duì)應(yīng)的設(shè)備文件名。
硬件驅(qū)動(dòng)程序負(fù)責(zé)讀寫(xiě)實(shí)際的硬件設(shè)備,比如從鍵盤(pán)讀入字符和把字符輸出到顯示器,
線路規(guī)程像一個(gè)過(guò)濾器,對(duì)于某些特殊字符并不是讓它直接通過(guò),而是做特殊處理,比如在
鍵盤(pán)上按下Ctrl-Z,對(duì)應(yīng)的字符并不會(huì)被用戶程序的read讀到,而是被線路規(guī)程截獲,解釋
圖:1終端設(shè)備模塊
成SIGTSTP信號(hào)發(fā)給前臺(tái)進(jìn)程,通常會(huì)使該進(jìn)程停止。線路規(guī)程應(yīng)該過(guò)濾哪些字符和做哪些
特殊處理是可以配置的。
2網(wǎng)絡(luò)終端
虛擬終端或串口終端的數(shù)目是有限的,虛擬終端(字符控制終端)一般就是/dev/tty1_/
dev/tty6六個(gè),串口終端的數(shù)目也不超過(guò)串口的數(shù)目。然而網(wǎng)絡(luò)終端或圖形終端窗口的數(shù)目
卻是不受限制的,這是通過(guò)偽終端(Pseudo TTY)實(shí)現(xiàn)的。一套偽終端由一個(gè)主設(shè)備(PTY
Master)和一個(gè)從設(shè)備(PTY Slave)組成。主設(shè)備在概念上相當(dāng)于鍵盤(pán)和顯示器,只不過(guò)
它不是真正的硬件而是一個(gè)內(nèi)核模塊,操作它的也不是用戶而是另外一個(gè)進(jìn)程。從設(shè)備和上
面介紹的/dev/tty1這樣的終端設(shè)備模塊類(lèi)似,只不過(guò)它的底層驅(qū)動(dòng)程序不是訪問(wèn)硬件而是
訪問(wèn)主設(shè)備。網(wǎng)絡(luò)終端或圖形終端窗口的Shell進(jìn)程以及它啟動(dòng)的其它進(jìn)程都會(huì)認(rèn)為自己的
控制終端是偽終端從設(shè)備,例如/dev/pts/0、/dev/pts/1等。下面以telnet為例說(shuō)明網(wǎng)絡(luò)登
錄和使用偽終端的過(guò)程。
圖:2網(wǎng)絡(luò)終端
如果telnet客戶端和服務(wù)器之間的網(wǎng)絡(luò)延遲較大,我們會(huì)觀察到按下一個(gè)鍵之后要過(guò)幾秒鐘才能回顯到屏幕上。這說(shuō)明我們每按一個(gè)鍵telnet客戶端都會(huì)立刻把該字符發(fā)送給服務(wù)
器,然后這個(gè)字符經(jīng)過(guò)偽終端主設(shè)備和從設(shè)備之后被Shell進(jìn)程讀取,同時(shí)回顯到偽終端從
設(shè)備,回顯的字符再經(jīng)過(guò)偽終端主設(shè)備、telnetd服務(wù)器和網(wǎng)絡(luò)發(fā)回給telnet客戶端,顯示
給用戶看。也許你會(huì)覺(jué)得吃驚,但真的是這樣:每按一個(gè)鍵都要在網(wǎng)絡(luò)上走個(gè)來(lái)回!
總結(jié)
以上是生活随笔為你收集整理的1.进程间的关系:终端,网络设备的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一更新显卡就黑屏了怎么办 显卡更新后屏幕
- 下一篇: 2进程之间的关系:进程组,会话,守护进程