управление разрешением linux framebuffer (fb0) в графическом коде низкого уровня c - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь изучить низкоуровневое графическое программирование на Linux с использованием C. Я довольно плохо знаком с 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

1 Ответ

0 голосов
/ 30 октября 2018

/dev/fb0 обычно доступен для чтения и записи для группы video:

$ ls -la / dev / fb0

crw-rw ---- 1 корневое видео 29, 11 октября 12:40 / dev / fb0

Возможно, ваша программа принадлежит группе видео:

chgrp video my_program

и установите бит sgid:

chmod g+s my_program

Устанавливает так называемый эффективный gid (egid) вашего процесса, тогда как real gid наследуется от родителя. Теперь ваша программа должна иметь разрешение на открытие устройства framebuffer, даже если она не запускается от имени пользователя root.

В целях безопасности вы могли (должны?) Отбросить эти дополнительные привилегии после открытия файла устройства, установив для ffective gid значение real gid :

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

Таким образом, он должен работать так, как вы хотите.

...