写:无效的参数

时间:2018-04-18 11:11:36

标签: android linux

我在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

我的代码出了什么问题?几个小时我一直在努力解决这个问题。任何建议都表示赞赏。

谢谢

2 个答案:

答案 0 :(得分:0)

您的问题似乎是许可,因为您需要为写入文件设置标志

以下是您必须设置的不同标志。

试用此代码

int bfd = open("/sys/class/leds/lcd-backlight/brightness", O_WRONLY | O_APPEND | S_IWUSR |S_IXUSR |S_IXOTH);
  1. S_IRUSR将所有者的读取权限设置为true。
  2. S_IWUSR将所有者的写权限设置为true。
  3. S_IXUSR将所有者的执行权限设置为true。
  4. S_IRGRP将组的读取权限设置为true。
  5. S_IWGRP将该组的写权限设置为true。
  6. S_IXGRP将组的执行权限设置为true。
  7. S_IROTH将其他用户的读取权限设置为true。
  8. S_IWOTH将其他用户的写权限设置为true。
  9. S_IXOTH将其他用户的执行权限设置为true。
  10. 希望这会有所帮助

答案 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 */
}