C编写Android原生程序写入/sys节点报write: Invalid Argument错误求助
解决Android原生C程序写入sysfs亮度节点报"Invalid argument"的问题
这问题我之前帮不少开发者排查过,核心原因大多是对sysfs节点的写入规则不熟悉,咱们一步步拆解:
最可能的根源:写入内容格式错误
sysfs下的brightness节点要求写入字符串形式的十进制数字(部分设备还要求带换行符),而不是二进制整数。看你代码里的write(bfd, p,...,如果p是指向int类型的指针,直接把二进制整数写进去,系统根本无法解析,自然返回Invalid argument。
举个正确的写法:
// 假设*p是你要设置的亮度值(比如0-255之间的整数) char brightness_buf[16]; // 把数字转成带换行的字符串 snprintf(brightness_buf, sizeof(brightness_buf), "%d\n", (int)*p); ssize_t write_ret = write(bfd, brightness_buf, strlen(brightness_buf)); if (write_ret < 0) { perror("write"); close(bfd); exit(EXIT_FAILURE); }
其他需要排查的点
- 路径是否匹配:你问题描述里写的是
/sys/class/leds/lcd-brightness/brightness,但代码里是/sys/class/leds/lcd-backlight/brightness。不同Android设备的亮度节点命名可能不同,先在设备上执行ls /sys/class/leds/确认实际存在的节点名称,比如有些设备叫panel-backlight。 - Open参数是否完整:虽然
O_WRONLY基本够用,但部分节点可能需要加上O_TRUNC,可以试试open(path, O_WRONLY | O_TRUNC)。 - SELinux限制:虽然你用root权限运行,但Android的SELinux可能会拦截写入操作。不过
Invalid argument一般不是权限问题(权限不足会报Permission denied),如果前面的方法都无效,可以临时执行setenforce 0关闭SELinux测试,若能正常写入,再考虑添加对应的SELinux规则。
内容的提问来源于stack exchange,提问作者zhuo.quan
相关产品推荐
相关产品推荐

