c - 在低级 c 图形代码中管理 linux framebuffer(fb0) 权限

标签 c linux graphics permissions framebuffer

我正在尝试使用 C 在 Linux 上学习低级图形编程。我对 Linux 和 C 都很陌生。我正在尝试找出最负责任的方式来管理 /dev/的权限fb0 在我的代码中。

我的代码:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>

int main(){

    int fb_fd = 0;
    // Open the file for reading and writing
    fb_fd = open("/dev/fb0", O_RDWR);
    if (fb_fd == -1) {
    perror("Error: cannot open framebuffer device");
    exit(1);
    }
    printf("The framebuffer device was opened successfully.\n");

    struct fb_fix_screeninfo finfo;
    struct fb_var_screeninfo vinfo; 
    //Get variable screen information
    ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo);

    //Get fixed screen information
    ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo);

    printf("vinfo.bits_per-pixel: %d\n",vinfo.bits_per_pixel);
    close(fb_fd);
    return(0);
}

我的问题:程序仅使用 sudo ./my_program 运行,否则无法打开帧缓冲区(权限被拒绝)。我不确定在编写要绘制到帧缓冲区的软件时,通常如何管理 /dev/fb0 的权限。我如何“授权”我的程序,让普通用户在没有特殊权限的情况下运行?

编辑:根据要求,一些控制台输出: 设置模式和权限

~/learning_c/game_0$ ls -l /dev/fb0
crw-rw---- 1 root video 29, 0 Oct 28 08:01 /dev/fb0
~/learning_c/game_0$ ls -l ./bin/game
-rwxrwxr-x 1 logan logan 15160 Oct 29 21:12 ./bin/game
~/learning_c/game_0$ chgrp video ./bin/game
chgrp: changing group of './bin/game': Operation not permitted
~/learning_c/game_0$ sudo chgrp video ./bin/game
[sudo] password for logan:
~/learning_c/game_0$ ls -l ./bin/game
-rwxrwxr-x 1 logan video 15160 Oct 29 21:12 ./bin/game
~/learning_c/game_0$ sudo chmod -v  g+s ./bin/game
mode of './bin/game' changed from 0775 (rwxrwxr-x) to 2775 (rwxrwsr-x)
~/learning_c/game_0$ ls -l ./bin/game
-rwxrwsr-x 1 logan video 15160 Oct 29 21:12 ./bin/game

尝试运行./bin/game

~/learning_c/game_0$ ./bin/game
Error: cannot open framebuffer device: Permission denied
logan@logan-Aspire-5560:~/learning_c/game_0$ sudo ./bin/game
[sudo] password for logan:
The framebuffer device was opened successfully

最佳答案

/dev/fb0 通常对 video 组是可读写的:

$ ls -la /dev/fb0

crw-rw---- 1 root video 29, 0 Oct 11 12:40 /dev/fb0

您可以让您的程序归 group video 所有:

chgrp video my_program

并在其上设置 sgid 位:

chmod g+s my_program

这会设置进程的所谓有效 gid (egid),而真实 gid 是从父进程继承的。现在您的程序应该有权打开帧缓冲设备,即使不是以 root 用户运行也是如此。

出于安全原因,您可以(应该?)在打开设备文件后通过将有效 gid 设置为真实 gid 来放弃这些额外权限:

fb_fd = open("/dev/fb0", O_RDWR);
setegid(getgid());

这样它就可以如您所愿地工作。

关于c - 在低级 c 图形代码中管理 linux framebuffer(fb0) 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53052294/

相关文章:

c - Linux 上 fork() 创建的子进程是否可以在 SMP 环境中的单独内核上运行?

c - 字符串反转程序中的内存问题

linux - 我应该在关闭主机之前关闭 lxc 容器吗?

公网IP地址的Linux命令

ios - OpenGL ES 2D 绘图性能评估

android - 编写一个可爱的 Android GUI?

c - 防止 Frama-C 的切片插件更改输入代码

c - 如何检查一个点是否在点簇内

linux - 解压缩连接两个 gzip 文件的结果是否总是等于以原始和解压缩形式连接两个文件的结果?

c - OpenGL - 帧缓冲区深度纹理不同于颜色深度纹理