我有一个处理多个TCP连接的驱动程序。
有没有办法在给定struct sock
列表的内核中执行类似于用户空间应用api的select / poll()/ epoll()的内容?
由于
答案 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()
。