您的位置:首页 > 运维架构 > Linux

linux下获取当前屏幕分辨率和当前终端行列数的简单方法

2016-07-25 11:47 766 查看
最近在学习linux系统编程,在编写自己的ls命令,实现对得到文件信息进行对齐时,发现不同分辨率的屏幕和不同窗口大小的终端对信息的对齐需求不同,如能获取屏幕分辨率和终端行列数,经过算法能对获得文件的信息进行很好的对齐,于是学习了获取屏幕分辨率和终端行列数的方式。

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 编程