終端i/o應用很廣泛,用於終端、計算機之間的直接連線、數據機以及印表機等等。終端i/o有兩種不同的工作模式:
(1)規範模式輸入處理:終端輸入以行為單位進行處理,對於每個讀要求,終端驅動程式最多返回一行。(預設模式)
(2)非規範模式輸入處理:輸入字元並不組成行。
終端裝置是由一般位於核心的終端驅動程式控制的,每個終端裝置有乙個輸入佇列和乙個輸出佇列。如下圖:
可以檢測和更改的終端裝置特性都包含在termios結構中。該結構定義在
struct termios
終端i/o函式
寫個程式,更改特殊字元,禁用中斷字元和更改檔案結束符。程式如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6獲取和設定終端屬性函式:7 int main()
8 17 if((vdisable = fpathconf(stdin_fileno,_pc_vdisable))<0)
18
22 //獲取termios結構
23 if(tcgetattr(stdin_fileno,&term) < 0)
24
28 29 term.c_cc[vintr] = vdisable;
30 term.c_cc[veof] = 2;
31 //設定termios結構
32 if(tcsetattr(stdin_fileno,tcsaflush,&term) < 0)
33
37 return 0;
38 }
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions,const struct termios *termios_p);
呼叫以上函式遮蔽標誌取或設定乙個值,程式如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6stty命令:在終端中輸入stty -a命令顯示終端的所有選項,執行命令結果如下:7 int main()
8 16 switch(term.c_cflag & csize)
17
33 term.c_cflag &= ~csize; //字元長度清0
34 term.c_cflag |= cs5; //設定為8 bites/byte
35 if(tcsetattr(stdin_fileno,tcsanow,&term) < 0)
36
40 return 0;
41 }
終端標識:在大多數unixi系統中,控制終端的名字是/dev/tty。
char *ctermid(char *s); //獲取終端控制名字
int isatty(int fd); //判斷fd是否為終端裝置
char *ttyname(int fd); // 獲取終端裝置的路徑名
寫個程式輸出控制終端的識別符號資訊,程式如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6 static char ctermid_name[l_ctermid];程式執行結果如下:7 char* my_ctermid(char *str)
8 13 int main()
14 32 else
33 name = "not a tty";
34 printf("fd 0 :%s\n",name);
35 if(isatty(1))
36
41 else
42 name = "not a tty";
43 printf("fd 1 :%s\n",name);
44 if(isatty(2))
45
50 else
51 name = "not a tty";
52 printf("fd 2 :%s\n",name);
53 exit(0);
54 }
終端的視窗大小:核心為每個終端和偽終端儲存了乙個視窗大小結構winszie,用ioctl函式的tiocgwinsz命令可以獲取此結構的當前值。
struct winsize ;
寫個程式列印終端視窗大小,程式如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9程式執行結果如下:10 static void pr_winsize(int fd)
11 18 printf("%d rows,%d columns\n",size.ws_row,size.ws_col);
19 }
20 static void sig_winch(int signo)
21 25 int main()
26 32 if(signal(sigwinch,sig_winch) == sig_err)
33
37 pr_winsize(stdin_fileno);
38 for( ; ;)
39 pause();
40 }
總結:本章介紹了終端,涉及到很多系統底層的知識,很多引數。看的時候只是了解了一些基本的終端操作,還要很多地方不懂,關鍵是不知道終端用在什麼地方,以後用到了需要回頭好好學習一下。
unix環境高階程式設計
unix 日曆時間 自1970 年1 月1 日00 00 00 以來的國際標準時間 utc 程序時間 cpu 時間 時鐘時間 程序執行時間的總量。使用者cpu 時間 執行使用者指令時間量。系統cpu 時間 執行核心所經歷時間。命令 time 第三章至第七章 原子操作 任何乙個要求多於1 個函式呼叫的...
unix環境高階程式設計
檔案描述符file descriptor通常是乙個小的非負整數,核心用以標識乙個特定程序正在訪問的檔案。當核心開啟乙個現有檔案或建立乙個新檔案時,它都返回乙個檔案描述符。在讀寫檔案時,可以私用這個檔案描述符。按管理,每當執行乙個新程式時,所有的shell都為其開啟了3個標準檔案描述符 標準輸入,標準...
UNIX環境高階程式設計
本書是被譽為unix程式設計 聖經 的advanced programming in the unix environment一書的更新版。在本書第1版出版後的十幾年中,unix行業已經有了巨大的變化,特別是影響unix程式設計介面的有關標準變化很大。本書在保持了前一版風格的基礎上,根據最新的標準對...