2. 获取屏幕分辨率与色深
任务目标
在Linux用户空间通过ioctl系统调用获取Framebuffer设备的屏幕分辨率(xres、yres)和色深(bits_per_pixel),并将结果打印到终端验证。
环境与依赖
- Linux系统(带Framebuffer设备,如
/dev/fb0) - 设备节点存在且有读写权限(通常需要root或video组)
- 内核已启用Framebuffer支持(
CONFIG_FB) - 编译依赖:Linux内核头文件(提供
<linux/fb.h>)
核心实现
使用FBIOGET_VSCREENINFO命令获取struct fb_var_screeninfo结构体,其中包含当前显示模式的可变参数。该结构体中的xres、yres为可见分辨率,bits_per_pixel为色深。以下代码打开设备、执行ioctl并打印结果:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
int main(int argc, char *argv[]) {
const char *dev_path = (argc > 1) ? argv[1] : "/dev/fb0";
int fd = open(dev_path, O_RDONLY);
if (fd < 0) {
perror("open");
return 1;
}
struct fb_var_screeninfo vinfo;
if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0) {
perror("ioctl(FBIOGET_VSCREENINFO)");
close(fd);
return 1;
}
printf("设备: %s\n", dev_path);
printf("分辨率: %u x %u\n", vinfo.xres, vinfo.yres);
printf("色深: %u bits_per_pixel\n", vinfo.bits_per_pixel);
close(fd);
return 0;
}
编译与运行
# 编译
gcc -o fb_info fb_info.c
# 运行(默认读取 /dev/fb0,也可指定其他设备)
./fb_info
# 或指定设备
./fb_info /dev/fb1
验证方法
程序执行后,终端会输出三行信息。判定通过的依据:
- 程序正常退出,退出码为0,无
open或ioctl错误提示。 - 输出的分辨率与色深与系统实际Framebuffer配置一致。可通过以下命令交叉验证:
# 使用fbset查看当前模式(若已安装)
fbset -i
# 或检查内核日志中的Framebuffer初始化信息
dmesg | grep -i fb0
若fbset显示的分辨率、色深与程序输出一致,则验证通过。例如,若系统配置为1920x1080、32bpp,程序应输出:
设备: /dev/fb0
分辨率: 1920 x 1080
色深: 32 bits_per_pixel
注意:上述为预期输出示例,实际值取决于运行环境的Framebuffer配置。
常见问题
- open失败:确认设备节点存在且当前用户有访问权限(
ls -l /dev/fb0),必要时sudo运行。 - ioctl失败:确认内核支持Framebuffer且设备未被占用;部分虚拟显示设备可能不支持该ioctl命令。
- 输出为0:某些驱动在未设置显示模式时返回0,可尝试先运行
fbset设置分辨率后再执行本程序。