1. 終端
在UNIX系統中,用戶通過終端登錄系統后得到一個Shell進程,這個終端成為Shell進 程的控制終端(Controlling Terminal),在前面文章我們說過,控制終端是保存在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函數可以由文件描述符查出對應的文件名,該文件描述符必須指向一個終端 設備而不能是任意文件。下面我們通過實驗看一下各種不同的終端所對應的設備文件名。
#include <unistd.h>
#include <stdio.h>
int main() {printf("fd 0: %s\n", ttyname(0)); printf("fd 1: %s\n", ttyname(1));