大多数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) */
};
此结构的作用如下:
?
实例:打印当前窗口大小,然后休眠。每次窗口大小改变时,就捕捉到SIGWINCH信号,然后打印新的窗口大小。必须用一个信号终止此程序。
程序清单18-12 打印窗口大小
#include "apue.h"
#include <termios.h>
#ifndef TIOCGWINSZ
#include <sys/ioctl.h>
#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);
}
?
int
main(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();
}
新闻热点
疑难解答