大多數unix系統都提供了一種功能,可以對當前終端視窗的大小進行跟蹤,在視窗大小發生變化時,使核心通知前台程序組。核心為每個終端和偽終端儲存乙個winsize結構:
struct winsize {
unsigned short ws_row; /* rows, in character */
unsigned short ws_col; /* columns, in characters */
unsigned short ws_xpixel; /* horizontal size, pixels (unused) */
unsigned short ws_ypixel; /* vertical size, pixels (unused) */
此結構的作用如下:
用ioctl函式的tiocgwinsz命令可以取此結構的當前值。
用ioctl函式的tiocswinsz命令可以將此結構的新值存放到核心中。如果此新值與存放在核心中的當前值不同,則向前臺程序組傳送sigwinch訊號。
除了存放此結構的當前值以及在此值改變時產生乙個訊號以外,核心對該結構不進行任何其他操作。對結構中的值進行解釋完全是應用程式的工作。
提供這種功能的目的是,當視窗大小發生變化時通知應用程式(例如,vi編輯器)。應用程式接到此訊號後,它可以取視窗大小的新值,然後重繪螢幕。
例項:列印當前視窗大小,然後休眠。每次視窗大小改變時,就捕捉到sigwinch訊號,然後列印新的視窗大小。必須用乙個訊號終止此程式。
程式清單18-12 列印視窗大小
#include "apue.h"
#include
#ifndef tiocgwinsz
#include
#endif
static void
pr_winsize(int fd)
struct winsize size;
if(ioctl(fd, tiocgwinsz, (char *)&size) < 0)
err_sys("tiocgwinsz error");
printf("%d rows, %d columns\n", size.ws_row, size.ws_col);
static void
sig_winch(int signo)
printf("sigwinch received\n");
pr_winsize(stdin_fileno);
intmain(void)
if(isatty(stdin_fileno) == 0)
exit(1);
if(signal(sigwinch, sig_winch) == sig_err)
err_sys("signal error");
pr_winsize(stdin_fileno); /* print initial size */
for(;;) /* and sleep forever */
pause();
終端I O之終端選項標誌
中的表18 1至表18 4中列出的所有選項標誌 除遮蔽標誌外 都用一位或幾位 設定或清除 表示,而遮蔽標誌則定義多位,它們組合在一起,於是可以定義多個值。遮蔽位有乙個定義名,每個值也有乙個名字。例如,為了設定字元長度,首先用字元長度遮蔽標誌csize將表示字元長度的位清0,然後設定下列值之一 cs5...
終端I O之終端選項標誌
中的表18 1至表18 4中列出的所有選項標誌 除遮蔽標誌外 都用一位或幾位 設定或清除 表示,而遮蔽標誌則定義多位,它們組合在一起,於是可以定義多個值。遮蔽位有乙個定義名,每個值也有乙個名字。例如,為了設定字元長度,首先用字元長度遮蔽標誌csize將表示字元長度的位清0,然後設定下列值之一 cs5...
終端視窗大小和 termcap
多數 unix 系統都提供了一種跟蹤當前終端視窗大小的方法。在視窗大小發生變化時,核心就會通知前台程序組。核心為每個終端和偽終端都維護了乙個如下的 winsize 結構。struct winsize 此結構的規則如下 1 用 ioctl 函式 見 url 終端i o函式 ioctl url 一節 的...