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
相关产品推荐
相关产品推荐

