3

我正在尝试制作一个类似于 boost socket 的 asio 扩展,并在 windows 和 linux 上实现。这些扩展将用于使用 EIBD 与 Linux 的 KNX 网络进行交互。问题是,如何监控多个文件描述符。如果使用 select() 如何绕过 FD_SETSIZE 限制?

boost 如何在套接字实现中处理这个问题?据我所知,Windows 上使用的是 IO 完成端口。

4

1 回答 1

3

我的问题的简短回答是使用epoll。根据维基百科,epoll 是一种适用于 Linux 的可扩展 I/O 事件通知机制,最早在 Linux 内核 2.5.44 中引入。

select(2) 一次最多可以监控 FD_SETSIZE 个描述符,通常是在 libc 编译时确定的少量描述符。相反,epoll 没有这样的固定限制,并且不执行任何线性扫描。因此,它能够更好地执行并处理更多的事件。

有关如何使用 epoll 的教程,请访问 banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/

至于 Boost,在很多平台上,Boost.Asio 以 Reactor 的形式实现了 Proactor 设计模式,例如 select(kernel 2.4)、epoll(kernel 2.6) 或 kqueue(Mac OS)。

在 Windows NT、2000 和 XP 上,Boost.Asio 利用重叠 I/O 来提供 Proactor 设计模式的有效实现。

更多关于提升:

www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/overview/core/async.html

www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/design/implementation.html

于 2013-01-29T07:42:13.327 回答