可以在C中读取但不能写入proc文件
Can read but not write proc file in C
我正在编写一个 C 程序来更改屏幕亮度,因为 xbacklight 在我的情况下不起作用。解决方案应该是原生 C(没有 system() 函数),因为该程序应该可以通过 setuid 作为普通用户执行。调用外部 shell 命令或脚本会导致内核忽略此位。
读取控制亮度的 proc 文件工作正常,但使用 C 写入它不会产生任何结果,即使我 运行 程序作为 root。 fprintf调用returns-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);
}
f = fopen(brightness, (!strncmp(argv[1], "get", 3)) ? "r" : "rw");
"rw"
不是 fopen(3)
的 mode
参数的有效参数。要使用 fopen(3)
在 read/write 模式下打开文件,您应该使用 "r+"
.
使用 "rw"
是未定义的行为——在 Linux/glibc 中它将被视为单个 "r"
,文件将以 read-only 模式打开,并且printf
-> write
会失败。
一般来说,对如此小的文件使用缓冲 i/o 并不是一个明智的主意。如果您需要将格式化数据写入文件描述符,您应该查看 dprintf(3)
。
此外,我会在 setuid 程序中使用固定值列表,而不必验证参数,并注意验证代码本身不会成为一种责任,等等。
我正在编写一个 C 程序来更改屏幕亮度,因为 xbacklight 在我的情况下不起作用。解决方案应该是原生 C(没有 system() 函数),因为该程序应该可以通过 setuid 作为普通用户执行。调用外部 shell 命令或脚本会导致内核忽略此位。
读取控制亮度的 proc 文件工作正常,但使用 C 写入它不会产生任何结果,即使我 运行 程序作为 root。 fprintf调用returns-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);
}
f = fopen(brightness, (!strncmp(argv[1], "get", 3)) ? "r" : "rw");
"rw"
不是 fopen(3)
的 mode
参数的有效参数。要使用 fopen(3)
在 read/write 模式下打开文件,您应该使用 "r+"
.
使用 "rw"
是未定义的行为——在 Linux/glibc 中它将被视为单个 "r"
,文件将以 read-only 模式打开,并且printf
-> write
会失败。
一般来说,对如此小的文件使用缓冲 i/o 并不是一个明智的主意。如果您需要将格式化数据写入文件描述符,您应该查看 dprintf(3)
。
此外,我会在 setuid 程序中使用固定值列表,而不必验证参数,并注意验证代码本身不会成为一种责任,等等。