ioctl函数的使用之查看终端屏幕大小

时间:2021-07-11 20:02:39

要想查看一个终端屏幕的大小,可以使用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 返回