在设备驱动程序中使用select()/ poll()

时间:2014-12-02 12:28:21

标签: linux linux-kernel

我有一个处理多个TCP连接的驱动程序。

有没有办法在给定struct sock列表的内核中执行类似于用户空间应用api的select / poll()/ epoll()的内容?

由于

2 个答案:

答案 0 :(得分:6)

您可能希望编写自己的自定义sk_buff处理程序,该处理程序调用试图锁定信号量的kernel_select()并在套接字打开时执行阻塞等待。

不确定您是否已浏览此链接Simulate effect of select() and poll() in kernel socket programming

答案 1 :(得分:2)

在内核方面,很容易避免直接使用sys_epoll()接口。毕竟,你可以直接访问内核对象,无需跳过箍。

每个file对象,包含的套接字,“覆盖”其file_operations“vtable”中的轮询方法。您可以简单地遍历所有套接字,在每个套接字上调用->poll()并定期或在没有可用数据时产生。

如果套接字的流量相当高,则除此之外不需要任何其他内容。

关于API的说明:

poll()方法需要poll_table()参数,但是如果您不打算等待它,可以安全地将其初始化为null:

poll_table pt;
init_poll_funcptr(&pt, NULL);
...
// struct socket *sk;
...
unsigned event_mask = sk->ops->poll(sk->file, sk, &pt);

如果您确实想要等待,只需通过poll_table将回调设置为init_poll_funcptr()