linux下获取当前屏幕分辨率和当前终端行列数的简单方法
2016-07-25 11:47
766 查看
最近在学习linux系统编程,在编写自己的ls命令,实现对得到文件信息进行对齐时,发现不同分辨率的屏幕和不同窗口大小的终端对信息的对齐需求不同,如能获取屏幕分辨率和终端行列数,经过算法能对获得文件的信息进行很好的对齐,于是学习了获取屏幕分辨率和终端行列数的方式。
1.获取屏幕分辨率
这段代码通过打开/dev/fb0,利用ioctl系统调用获取屏幕属性信息存放在结构体变量screen_info中,xres和yres则分别是结构体fb_var_screeninfo中屏幕的横向纵向分辨率信息。而Framebuffer(fb)是用一个视频输出设备从包含完整的帧数据的一个内存缓冲区中来驱动的一个视频显示设备,而宏定义FBIOGET_VSCREENINFO则是让ioctl系统调用能从Framebuffer中获取相应的显示设备信息,宏定义的详情在/usr/include/linux/fb.h里。
![](http://img.blog.csdn.net/20160725142819102)
2.获取当前终端行列数
这段代码通过从STDIN_FILENO中,通过ioctl系统调用获取当前终端信息,存放到结构体变量info中,而ws_row和ws_col分别存放的是当前终端的行列数信息。
关于struct winsize的信息如下:
而对于TIOCGWINSZ宏定义,在ioctl系统调用中用TIOCGWINSZ可以取struct winsize的当前值。
PS:STDIN_FILENO是标准输入的文件描述符,信息在/usr/include/unistd.h里
1.获取屏幕分辨率
#include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<sys/mman.h> #include<sys/ioctl.h> #include<unistd.h> #include<fcntl.h> #include<linux/fb.h> int main(int argc,char *argv[]){ int fd; struct fb_var_screeninfo screen_info; fd = open("/dev/fb0",O_RDWR); ioctl(fd,FBIOGET_VSCREENINFO,&screen_info); printf("%d*%d\n",screen_info.xres,screen_info.yres); close(fd); return 0; }
这段代码通过打开/dev/fb0,利用ioctl系统调用获取屏幕属性信息存放在结构体变量screen_info中,xres和yres则分别是结构体fb_var_screeninfo中屏幕的横向纵向分辨率信息。而Framebuffer(fb)是用一个视频输出设备从包含完整的帧数据的一个内存缓冲区中来驱动的一个视频显示设备,而宏定义FBIOGET_VSCREENINFO则是让ioctl系统调用能从Framebuffer中获取相应的显示设备信息,宏定义的详情在/usr/include/linux/fb.h里。
2.获取当前终端行列数
#include<stdio.h> #include<stdlib.h> #include<sys/ioctl.h> #include<termios.h> #include<signal.h> #include<unistd.h> int main(int argc,char *argv[]){ struct winsize info; ioctl(STDIN_FILENO,TIOCGWINSZ,&info); printf("当前终端为%d行%d列\n",info.ws_row,info.ws_col); return 0; }
这段代码通过从STDIN_FILENO中,通过ioctl系统调用获取当前终端信息,存放到结构体变量info中,而ws_row和ws_col分别存放的是当前终端的行列数信息。
关于struct winsize的信息如下:
struct winsize{ unsigned short ws_row; unsigned short ws_col; unsigned short ws_xpixel;//当前终端横向像素信息 unsigned short ws_ypixel;//当前终端纵向像素信息 };
而对于TIOCGWINSZ宏定义,在ioctl系统调用中用TIOCGWINSZ可以取struct winsize的当前值。
PS:STDIN_FILENO是标准输入的文件描述符,信息在/usr/include/unistd.h里
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍