一、获得终端窗口大小的方法
1、在shell下可以直接用$LINES和$COLUMNS两个变量,$LINES是屏幕高,$COLUMNS是屏幕宽,单位都是字符数。
2、大多数UNIX系统都提供了一种功能,可以对当前终端窗口的大小进行跟踪,在窗口大小发生变化时,使内核通知前台进程组。内核为每个终端和伪终端保存一个winsize结构:
//其中struct winsize位于termios.h头文件内
//具体位置vim /usr/include/asm-generic/termios.h
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) */
};
二、winsize的结构作用
1. 用ioctl函数的TIOCGWINSZ命令可以取此结构的当前值。
2. 用ioctl函数的TIOCSWINSZ命令可以将此结构的新值存放到内核中。如果此新值与存放在内核中的当前值不同,则向前台进程组发送SIGWINCH信号。
3. 除了存放此结构的当前值以及在此值改变时产生一个信号以外,内核对该结构不进行任何其他操作。对结构中的值进行解释完全是应用程序的工作。
4. 提供这种功能的目的是,当窗口大小发生变化时通知应用程序(例如,vi编辑器)。应用程序接到此信号后,它可以取窗口大小的新值,然后重绘屏幕。
三、代码测试
/*
* 通过函数 ioctl(); 获得终端界面的参数
* @author 李政 <1244109467@qq.com>
*/
//具体实现方法
#include<stdio.h>
#include<sys/types.h>
#include<sys/ioctl.h>
#include<unistd.h>
#include<termios.h>
int main()
{
//定义winsize 结构体变量
struct winsize size;
//TIOCSWINSZ命令可以将此结构的新值存放到内核中
ioctl(STDIN_FILENO,TIOCGWINSZ,&size);
printf("%d\n",size.ws_col);
printf("%d\n",size.ws_row);
return 0;
}
版权声明:本文为weixin_42205987原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。