要想查看一个终端屏幕的大小,可以使用ioctl()函数,步骤如下。
1.首先找到对应终端的文件号,一般在 /dev/pts/....(0,1,2..)。具体几号需要自己验证。如在pts目录下使用命令
(echo "abcde" > 2)将abcde打印到2号终端上。
2,找到终端文件后,以2号为例,打开该文件,代码如下:
int fd;
#define DEV /dev/pts/2
fd=open(DEV,O_RDONLY|O_NOCTTY)//以只读且不控制该终端的模式打开该文件,返回文件描述符
3.通过ioctl()函数操作来查看2号终端屏幕大小
ioctl可以使用的命令列表可以通过 man ioctl_list 来查看,中间为命令,右面是返回值类型
如查看屏幕大小的函数是TIOCGWINSZ,如果想要使用该函数和声明变量,必须要加入该函数的上面的头文件(备注:由于Linux下的man手册没有及时更新,所以需要自己在include下手动查找一下,验证此头文件是否改变。如TIOCGWINSZ函数的头文件改为
<asm/termios.h>)
部分代码如下:
struct winsize size;
ioctl(fd,TIOCGWINSZ,&size);
解释:由于TIOCGWINSZ的返回值类型是struct winsize * ,所以由此可以看出需要声明上面类型的变量来接,而返回值没有加const,所以应该被改变其中的值,所以声明的是变量,实参取地址。
4.打印返回值。
问:虽然知道了返回值是个结构体。但是我们怎么知道结构体内有什么成员变量呢?
解:通过tag查找,如果已经在vim中设置了tags( tags是将include目下所有文件生成索引数据文件,如果没有设置见附录安装),可以将光标放到要查找的类型上面(只能查找enum,struct,#define,typedef),如struct winsize size的红色单词,然后按“ctrl”+"]",来进行查找,按“ctrl”+"T"返回。
找到成员变量后打印大家应该都会了把,在这里就不列举了。
附录:ctags 的设置
ctags:建立查找索引 可以查找enum struct #define typedef
1.建立查找对象索引数据文件
[root@king IO]# cd /usr/include/
[root@king include]# ctags -R ./ 将include目下所有文件生成索引数据文件tags
2.修改vim配置文件 支持tags查找
[root@king include]# vim /etc/vimrc
增加 set tags=/usr/include/tags
3.使用方法
在vim中光标处于要查找的对象上,ctrl+]进行查找 ctrl+t 返回