Unix環境高階程式設計 十九 終端I O

2021-09-07 16:58:48 字數 3459 閱讀 8323

終端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 6 

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 }

stty命令:在終端中輸入stty -a命令顯示終端的所有選項,執行命令結果如下:

終端標識:在大多數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程式設計介面的有關標準變化很大。本書在保持了前一版風格的基礎上,根據最新的標準對...