【发布时间】:2019-07-10 22:36:05
【问题描述】:
我正在编写一个 C 程序来更改屏幕亮度,因为 xbacklight 在我的情况下不起作用。解决方案应该是原生 C(没有 system() 函数),因为程序应该可以通过 setuid 作为普通用户执行。调用外部 shell 命令或脚本会导致内核忽略该位。
读取控制亮度的 proc 文件可以正常工作,但使用 C 写入它不会产生任何结果,即使我以 root 身份运行程序。 fprintf 调用返回 -130,指示错误。作为健全性检查,我包含了一个使用 system() 作为注释的工作解决方案。
[...]
const char* brightness = "/sys/class/backlight/intel_backlight/brightness";
f = fopen(brightness, (!strncmp(argv[1], "get", 3)) ? "r" : "rw");
[...]
int get_brightness() {
int buff;
fscanf(f, "%d", &buff);
return buff;
}
int set(int i) {
i = MAX(0, MIN(255, i));
fprintf(f, "%d", i);
printf("%d", i);
//char *cmd = (char*) malloc(59 *sizeof(char));
//snprintf(cmd, 59, "echo %d > %s", i, brightness);
//system(cmd);
//free(cmd);
}
【问题讨论】:
-
你为什么使用 rw 模式?
-
失败后的
errno是什么(你的代码没有检查fprintf()失败...)?使用sterror()或perror()获得人类可读的错误。 -
fprintf(f, "%d\n", i);工作得更好吗? -
@MarkPlotnick 在
/sys和/proc文件中写入的值不必由换行符终止。 -
要写入
/proc,您的进程必须以root权限运行。你确认# echo 5 > /sys/class/backlight/intel_backlight/brightness实际上改变了亮度吗?一些发行版实现实际上并不接受对brightness的更改。您应该阅读/sys/class/backlight/intel_backlight/max_brightness来设置可接受值的上限。
标签: c linux screen-brightness