Linux 5.10内核驱动如何获取打开/dev设备文件的进程所属用户组
解决思路
在Linux内核驱动的open回调执行时,上下文正处于触发open操作的用户进程的上下文中,不需要通过struct file的fown字段反向查找进程,直接使用内核提供的current相关辅助接口即可快速获取进程的所属用户组信息:
- 你需要先引入头文件
<linux/cred.h>,该头文件包含了所有进程凭证相关的接口定义 - 直接调用
current_gid()即可获取当前进程的有效用户组ID(egid),返回类型为内核态的kgid_t结构体 - 如果需要获取数值形式的组ID用于匹配逻辑,调用
from_kgid(&init_user_ns, 你获取到的kgid_t变量)即可转换为普通整数类型的gid值 - 如果业务需要使用真实用户组ID而非有效组ID,替换为
current_fsgid()或者current_gid()的对应变体即可
代码示例
#include <linux/cred.h> #include <linux/fs.h> #include <linux/user_namespace.h> static int pipe_open(struct inode *i, struct file *f) { kgid_t process_egid; gid_t egid_num; // 1. 获取当前进程有效组ID process_egid = current_gid(); // 2. 转换为数值类型gid egid_num = from_kgid(&init_user_ns, process_egid); /* 你的业务逻辑:用egid_num匹配对应组的独立管道实例 */ return 0; }
注意事项
- 不要通过
struct fown_struct存储的pid反向查找进程:该字段是为异步IO通知设计的,取值不一定对应当前触发open的进程,且pid存在复用风险,稳定性远低于直接使用current系列接口 - 如果需要访问进程的附加组列表,可通过
current_cred()->group_info获取,访问时需要遵循RCU读锁规则避免并发释放问题 - 如果你开发的驱动需要支持用户命名空间,替换
init_user_ns为对应进程的用户命名空间指针即可
内容的提问来源于stack exchange,提问作者CherMi
相关产品推荐
相关产品推荐

