終端視窗大小和 termcap

2021-09-02 21:41:14 字數 1722 閱讀 2969

多數 unix 系統都提供了一種跟蹤當前終端視窗大小的方法。在視窗大小發生變化時,核心就會通知前台程序組。核心為每個終端和偽終端都維護了乙個如下的 winsize 結構。

struct winsize;

此結構的規則如下:

1、用 ioctl 函式(見[url=終端i/o函式 ioctl[/url]一節)的 tiocgwinsz 命令可以取此結構的當前值。

2、用 ioctl 的 tiocswinsz 命令可以將此結構的新值儲存到核心中。如果此新值與儲存在核心中的當前值不同,則將向前臺程序組傳送 sigwinch 訊號(缺省會被忽略)。

3、除了儲存此結構的當前值以及在此值改變時產生乙個訊號以外,核心對該結構不進行任何其他操作。對結構中的值進行解釋是應用程式的工作。

提供這種功能的目的是,當視窗大小發生變化時應用程式能得到通知(如 vi 編輯器)。應用程式接收到此訊號後,可以獲取視窗大小的新值,然後重繪螢幕。

下面這個程式會列印當前視窗大小,然後休眠。之後每次視窗大小改變時,程式就捕捉 sigwinch 訊號,然後列印新的視窗大小。

#include

#include

#include

#include

#ifndef tiocgwinsz

#include

#endif

static void pr_winsize(int fd)

printf("%d rows, %d columns\n", size.ws_row, size.ws_col);

}static void sig_winch(int signo)

int main(void)

pr_winsize(stdin_fileno); // print initial size

for(;;) // and sleep forever

pause();

}

termcap 的意思是終端能力(terminal capability),它涉及文字檔案 /etc/termcap 和一套讀此檔案的例程,主要是為了支援 vi 編輯器而開發的。termcap 檔案包含了對各種終端的說明:終端支援哪些功能(如行數、列數、是否支援退格)、如何使終端執行某些操作(如清屏、移動游標到指定位置)等。把這些資訊從編譯過的程式中取出來並把它們放在易於編輯的文字檔案中,這樣就使得 vi 編輯器能在很多不同的終端上執行。最後,將支援 termcap 檔案的例程從 vi 編輯器中抽取出來,放在乙個單獨的 curses 庫中。為使這套庫可供要進行螢幕處理的任何程式使用,還增加了很多功能。

不過 termcap 這種技術並不是很完善。因為當越來越多的終端被加到資料檔案中時,為找到乙個特定的終端,可能需要花費很長的時間掃瞄此資料檔案。另外,該資料檔案還用兩個字元的名字來標識不同的終端屬性。因此出現了 terminfo 以及與其相關的 curses 庫。在 terminfo 中,終端說明基本上都是文字說明的編譯版本,在執行時易於被快速定位。

但不論是 termcap 還是 terminfo,它們本身都只提供在各種終端上執行典型操作(如清屏、移動游標等)的方法,而不處理如更改終端模式、更改終端特殊字元、處理視窗大小等問題。不過 curses 庫能提供某種具體細節方面的幫助。它提供了很多函式,用來設定原始模式、設定 cbreak 模式、開啟和關閉回顯等。注意,curses 庫是為基於字元的啞終端設計的,它們如今大部分已被基於畫素的影象終端所代替。

終端I O之終端視窗的大小

大多數unix系統都提供了一種功能,可以對當前終端視窗的大小進行跟蹤,在視窗大小發生變化時,使核心通知前台程序組。核心為每個終端和偽終端儲存乙個winsize結構 struct winsize unsigned short ws row rows,in character unsigned shor...

termcap 終端功能資料庫詳解

描述 description termcap 資料庫是乙個過時 obsolete 工具,用來描述以字元為單位的終端和印表機的功能。它之所以被保留,是為了相容古老的程式 新程式應當使用 terminfo 5 資料庫和相關的庫。etc termcap 是乙個 ascii 檔案 資料庫主控檔案 列出了許多...

termcap 終端功能資料庫詳解

描述 description termcap 資料庫是乙個過時 obsolete 工具,用來描述以字元為單位的終端和印表機的功能。它之所以被保留,是為了相容古老的程式 新程式應當使用 terminfo 5 資料庫和相關的庫。etc termcap 是乙個 ascii 檔案 資料庫主控檔案 列出了許多...