从 linux 内核驱动程序中获取用户组
Get user's group from linux kernel driver
我正在开发一个简单的管道内核驱动程序作为大学练习,我的任务是每个用户组的用户都应该能够访问他们自己的独立管道。但是我找不到如何获取打开我的驱动程序文件的用户组。
我有一个函数 static int pipe_open(struct inode *i, struct file *f)
,它在进程打开 /dev/ 中的驱动程序文件时从内核接收参数。结构文件确实包含有关打开该文件的进程的信息 (struct fown_struct),从那里我可以获得该进程的 pid 引用,但没有关于它所属的用户的信息。我使用的是内核 5.10,这里是我查找的源代码链接:struct file, struct fown_struct, struct pid, struct inode.
你能建议如何解决这个问题吗?
你看错地方了。
当内核执行系统调用时,current
是一个 struct task_struct
,它定义了调用者属性。它有一个成员 cred
,一个 struct cred
,表示调用者的有效凭证。它具有真实的、已保存的、有效的和文件系统用户和组 ID。
这意味着在 open() 时,在您的内核打开处理程序中,检查 current->cred.egid
以获取执行此打开调用的任务(进程的线程)的有效组 ID。
我正在开发一个简单的管道内核驱动程序作为大学练习,我的任务是每个用户组的用户都应该能够访问他们自己的独立管道。但是我找不到如何获取打开我的驱动程序文件的用户组。
我有一个函数 static int pipe_open(struct inode *i, struct file *f)
,它在进程打开 /dev/ 中的驱动程序文件时从内核接收参数。结构文件确实包含有关打开该文件的进程的信息 (struct fown_struct),从那里我可以获得该进程的 pid 引用,但没有关于它所属的用户的信息。我使用的是内核 5.10,这里是我查找的源代码链接:struct file, struct fown_struct, struct pid, struct inode.
你能建议如何解决这个问题吗?
你看错地方了。
当内核执行系统调用时,current
是一个 struct task_struct
,它定义了调用者属性。它有一个成员 cred
,一个 struct cred
,表示调用者的有效凭证。它具有真实的、已保存的、有效的和文件系统用户和组 ID。
这意味着在 open() 时,在您的内核打开处理程序中,检查 current->cred.egid
以获取执行此打开调用的任务(进程的线程)的有效组 ID。