可以在C中读取但不能写入proc文件

时间:2019-07-10 22:36:05

标签: c linux screen-brightness

我正在编写一个C程序来更改屏幕亮度,因为在我的情况下xbacklight不起作用。解决方案应该是本机C(没有system()函数),因为该程序应该可以通过setuid以普通用户身份执行。调用外部shell命令或脚本会导致内核忽略此位。

读取控制亮度的proc文件效果很好,但是即使我以root身份运行程序,使用C对其进行写入也不会产生任何结果。 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);
}

1 个答案:

答案 0 :(得分:1)

f = fopen(brightness, (!strncmp(argv[1], "get", 3)) ? "r" : "rw");

"rw"对于mode的{​​{1}}自变量无效。要使用fopen(3)以读写模式打开文件,应使用fopen(3)

使用"r+"是未定义的行为-在Linux / glibc中,它将被视为单个"rw",文件将以只读模式打开,而"r" -> printf将失败。

通常,将缓冲的I / O与如此小的文件一起使用不是一个很聪明的主意。如果您需要将格式化的数据写入文件描述符,则应该查看write

此外,我只需要在setuid程序中使用固定值列表即可,而不必验证参数,并且要确保验证代码本身不构成责任,等等。