我在C中编写一个本机可执行二进制文件,它将编写android设备节点:/sys/class/leds/lcd-brightness/brightness
。将其推送到/system/bin
并以root身份运行。
但是,系统调用write
将返回错误消息:"写入:无效的参数"
代码如下:
// set background brightness
int bfd = open("/sys/class/leds/lcd-backlight/brightness", O_WRONLY);
if(bfd < 0 ) {
perror("open");
exit(EXIT_FAILURE);
}
printf("bfd: %d\n", bfd);
printf("*p: %d\n", (int)*p);
if(write(bfd, p, 1) < 0) {
free(p);
perror("write");
exit(EXIT_FAILURE);
}
close(bfd);
close(fd);
p是指向数据的指针,我在写入之前打印* p,它可以。
/sys/class/leds/lcd-brightness/brightness
具有以下文件权限:
-rw-rw-rw 1 system system 4096 2018-04-18 18:46 brightness
我可以使用adb shell中的以下命令成功覆盖此文件
echo 100 > /sys/class/leds/lcd-backlight/brightness
我的代码出了什么问题?几个小时我一直在努力解决这个问题。任何建议都表示赞赏。
谢谢
答案 0 :(得分:0)
您的问题似乎是许可,因为您需要为写入文件设置标志
以下是您必须设置的不同标志。
试用此代码
int bfd = open("/sys/class/leds/lcd-backlight/brightness", O_WRONLY | O_APPEND | S_IWUSR |S_IXUSR |S_IXOTH);
S_IRUSR
将所有者的读取权限设置为true。S_IWUSR
将所有者的写权限设置为true。S_IXUSR
将所有者的执行权限设置为true。S_IRGRP
将组的读取权限设置为true。S_IWGRP
将该组的写权限设置为true。S_IXGRP
将组的执行权限设置为true。S_IROTH
将其他用户的读取权限设置为true。S_IWOTH
将其他用户的写权限设置为true。S_IXOTH
将其他用户的执行权限设置为true。希望这会有所帮助
答案 1 :(得分:0)
Sysfs属性期望数据以字符串格式,即以null终止的char数组。从您的代码看来,您似乎正在传递一个指向整数的指针:
printf("*p: %d\n", (int)*p);
尝试类似的东西:
int ret;
int bfd;
char p_str[24];
int bfd = open("/sys/class/leds/lcd-backlight/brightness", O_WRONLY);
if (bfd < 0) {
/* handle the error */
}
snprintf(p_str, sizeof p_str, "%i", p);
ret = write(bfd, p_str, sizeof(p_str));
if (ret < 0) {
/* handle the error */
}