在UNIX系統(tǒng)中,用戶通過終端登錄系統(tǒng)后得到一個Shell進程,這個終端成為Shell進程的控制終端(Controlling Terminal),控制終端是保存在PCB中的信息,而我們知道fork會復(fù)制PCB中的信息,因此由Shell進程啟動的其它進程的控制終端也是這個終端。默認(rèn)情況下(沒有重定向),每個進程的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出都指向控制終端,進程從標(biāo)準(zhǔn)輸入讀也就是讀用戶的鍵盤輸入,進程往標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯誤輸出寫也就是輸出到顯示器上。,在控制終端輸入一些特殊的控制鍵可以給前臺進程發(fā)信號,例如Ctrl-C表示SIGINT,Ctrl-\表示SIGQUIT。
init–>fork–>exec–>getty–>用戶輸入帳號–>login–>輸入密碼–>exec–>shell
每個進程都可以通過一個特殊的設(shè)備文件/dev/tty訪問它的控制終端。事實上每個終端設(shè)備都對應(yīng)一個不同的設(shè)備文件,/dev/tty提供了一個通用的接口,一個進程要訪問它的控制終端既可以通過/dev/tty也可以通過該終端設(shè)備所對應(yīng)的設(shè)備文件來訪問。ttyname函數(shù)可以由文件描述符查出對應(yīng)的文件名,該文件描述符必須指向一個終端設(shè)備而不能是任意文件。下面我們通過實驗看一下各種不同的終端所對應(yīng)的設(shè)備文件名。
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式