12、终端窗口大小
大多数UNIX系统提供一种方式,可以跟踪当前终端窗口大小,以便内核在大小改变的时候通知前台进程组。内核对每一个终端和伪终端维护一个窗口大小的结构。
struct winsize
{
unsigned short ws_row; /* rows, in characters */
unsigned short ws_col; /* columns, in characters */
unsigned short ws_xpixel; /* horizontal size, pixels (unused) */
unsigned short ws_ypixel; /* vertical size, pixels (unused) */
};
结构的规则如下:
- 我们可以通过使用TIOCGWINSZ的ioctl来获取当前结构的值。
- 我们可以通过TIOCSWINSZ的ioctl向内核存储一个新的这个结构的值。如果新的值和当前内核存放的值不同,那么会给前台进程组发送一个SIGWINCH信号。(需要注意的是前面说过,这个信号的默认情况是被忽略)
- 除了存放当前的结构值以及当值变化的时候发送信号之外,内核不会对这个结构做任何事情。对于这个结构的解释,完全交给应用程序来做。
提供这个特性的原因是为了在窗口大小改变的时候通知应用程序(例如vi编辑器)。当收到这个信号的时候,应用程序可以获取新的大小,然后重新绘制屏幕。
网友评论