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

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;
}

注意事项

  1. 不要通过struct fown_struct存储的pid反向查找进程:该字段是为异步IO通知设计的,取值不一定对应当前触发open的进程,且pid存在复用风险,稳定性远低于直接使用current系列接口
  2. 如果需要访问进程的附加组列表,可通过current_cred()->group_info获取,访问时需要遵循RCU读锁规则避免并发释放问题
  3. 如果你开发的驱动需要支持用户命名空间,替换init_user_ns为对应进程的用户命名空间指针即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:15:08