写入自定义sysfs节点dbc_backlight传非法值触发持续写入问题咨询
根本原因
这是Linux sysfs子系统对store回调的返回值语义要求导致的必然结果,核心逻辑如下:
- 用户态对sysfs节点执行
write()系统调用时,内核会先完成用户态数据到内核空间的拷贝,再调用你注册的节点store回调处理写入内容。 store回调的返回值有严格约定:- 返回非负整数:代表本次调用成功处理的字节数
- 返回负的错误码:代表处理失败,直接将错误透传给用户态
write()调用
- 你之前在非法参数分支返回0时,内核会判定你仅成功处理了0字节数据,而用户态传入的写入总长度大于0,内核会自动触发重试逻辑,反复调用你的
store回调尝试写入剩余未处理的字节,由此形成无限循环。 - 处于内核态无限循环执行的进程不会响应普通终止信号(SIGTERM),因此普通
kill命令无法终止,只有kill -9发送的SIGKILL信号会由内核直接强制回收进程,才能终止异常进程。 - 你将返回值修改为
-EINVAL后,内核识别为处理失败,直接终止写入流程并将错误返回给用户态,不会触发重试逻辑,因此问题消失。
注意:Linux内核编程规范明确要求,sysfs的
store/show回调处理失败时必须返回对应的负错误码,禁止返回0,否则会触发上述重试异常。
内容的提问来源于stack exchange,提问作者Samar Xie
相关产品推荐
相关产品推荐

