You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux内核proc模块写入功能失效,my_write回调未触发问题求助

问题排查结论

写入回调未触发的核心原因是proc文件权限配置不允许当前执行写入操作的用户进行写入,操作在VFS权限校验阶段就被拦截,未进入你注册的my_write回调逻辑。

根因说明

你在proc_create创建proc文件时传入的权限是0644:

  • 该权限位表示仅文件所有者(默认是root)拥有读写权限,用户组和其他用户仅拥有读权限
  • 你执行echo 1 > /proc/myprocfile时使用的是普通用户身份,权限校验不通过,内核直接返回Permission denied,不会调用你注册的写入回调
  • 多数shell环境下重定向操作的报错默认不会打印,你没有感知到权限错误,才会误以为是回调没注册成功

验证&修复方案

方案1:使用root权限执行写入操作

不要直接用sudo echo 1 > /proc/myprocfile,因为重定向操作的权限不会被sudo提升,需要执行以下命令:

sudo sh -c 'echo 1 > /proc/myprocfile'

执行后再查看dmesg即可看到my_write的日志。

方案2:修改proc文件权限(仅测试场景使用)

如果需要普通用户也能写入,可以将proc_create的第二个参数修改为0666:

my_proc_file = proc_create(
    FILE_NAME,
    0666, // 修改为所有用户可读写
    NULL,
    &proc_file_fops
);

注意:生产环境不要使用0666权限,会带来安全风险。

额外优化建议

  • 增加proc_create返回值判断,避免文件创建失败无法感知:
my_proc_file = proc_create(FILE_NAME, 0644, NULL, &proc_file_fops);
if (!my_proc_file) {
    pr_err("create proc file %s failed\n", FILE_NAME);
    return -ENOMEM;
}
  • 读写回调不要直接返回-1,需要返回正确的数值:读操作返回实际拷贝到用户空间的字节数,写操作返回实际写入的字节数,出错时返回负的标准错误码(如-EINVAL)。

内容的提问来源于stack exchange,提问作者carlos menjivar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:24:01