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设置分辨率后再执行本程序。