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

标签 sockets linux-kernel

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

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

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

最佳答案

我认为这不是一个坏主意。看看我某天写的这段代码:

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函数。

关于sockets - 如何获取套接字的所有者进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24924699/

相关文章:

android - 基于文件的加密(FBE)和全盘加密(FDE)有什么区别

linux - ethercat 模块的以太网驱动程序

memory-management - 通过 SYSFS 设置 nr_hugepages 时出错

python - 如何从一个连接接收多条消息?

sockets - 将 "Large"数据文件传输到服务器的简单 TCP 协议(protocol)

java - 在 Java 套接字中关闭流的正确方法

java - 声明来自套接字的输入/输出流以防止程序继续

java - 使用同一个客户端套接字向服务器套接字发送多条消息

c - Linux 设备驱动程序中的内联函数

c - 如何使用自己的函数覆盖系统调用表条目?