如何获取套接字的所有者进程?

时间:2014-07-24 03:35:07

标签: sockets linux-kernel

给定一个套接字结构,有什么方法可以在内核模块中获取此套接字的所有者进程?也就是说,给定一个套接字结构,我试图获取其所有者进程的进程描述符(task_struct struct)?

我最初的想法是遍历任务列表。对于遍历的每个进程,只需检查p的打开文件描述符是否包含与socket结构相关联的文件描述符相同的文件描述符。 (在struct socket中,有一个字段struct file *文件)。

我不确定内核是否允许我遍历任务列表。任何人都知道如何做到这一点?感谢。

1 个答案:

答案 0 :(得分:0)

我认为这不是一个糟糕的主意。看看我有一天写的代码:

struct task_struct *task;
struct list_head *t, *t1;
...
list_for_each(t, t1) {
#ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS
    if ((task_uid(task)).val == 0) /* no root processes, only userspace*/
#else
    if ((task_uid(task)) == 0)
#endif
    continue;
    task = list_entry(t, struct task_struct, tasks);
    /*Now you have task_struct of userspace program*/
    /*and may do whatever you want ))) */
    /*E.g. to figure out opened file descriptors*/
}

一点点补充:我想你知道这个代码应该在单个内核线程中运行。没有必要执行内核模块的init函数。