在Linux上不使用Epoll使用Boost Asio

5

我原本以为boost::asio默认使用epoll而不是select实现,但经过一些测试后,发现我的设置正在使用select。

操作系统:RHEL 4
内核:2.6
GCC:3.4.6

我编写了一个小测试程序来验证使用的反应器头文件,结果显示它正在使用select反应器而不是epoll反应器。

#include <boost/asio.hpp>

#include <string>
#include <iostream>

std::string output;

#if defined(BOOST_ASIO_EPOLL_REACTOR_HPP)

int main(void)
{
    std::cout << "you have epoll enabled." << std::endl;
}

#elif defined(BOOST_ASIO_DETAIL_SELECT_REACTOR_HPP)

int main(void)
{
    std::cout << "you have select enabled." << std::endl;
}

#else

int main(void)
{
    std::cout << "this shit is confusing." << std::endl;
}


#endif

我可能做错了什么?
1个回答

5

您的程序对我也显示“select”,但是asio正在使用epoll_wait(),如ps -Teo tid,wchan:25,comm所报告。

这样怎么样?

#include <iostream>
#include <string>
#include <boost/asio.hpp>
int main()
{
std::string output;
#if defined(BOOST_ASIO_HAS_IOCP)
  output = "iocp" ;
#elif defined(BOOST_ASIO_HAS_EPOLL)
  output = "epoll" ;
#elif defined(BOOST_ASIO_HAS_KQUEUE)
  output = "kqueue" ;
#elif defined(BOOST_ASIO_HAS_DEV_POLL)
  output = "/dev/poll" ;
#else
  output = "select" ;
#endif
    std::cout << output << std::endl;
}

今日免费次数已满, 请开通会员/明日再来

这段代码为我输出了"select"。在 epoll_reactor_fwd.hpp 中进行一些挖掘和更多测试后,LINUX_VERSION_CODE 返回的版本小于 2.4.45(显然需要使用 epoll)。uname -r 返回如下信息: $uname -r 2.6.9-78.0.13.ELsmp如果在 epoll_reactor_fwd.hpp 中处理所需的内核,我可以让您的程序输出 "epoll"。这是某种服务器配置错误吗? - Scott Lawson
确实是这样。我的开发系统将LINUX_VERSION_CODE输出为132639或KERNEL_VERSION(2,6,31)(它是随2.6.31.5一起发布的 - 这是一个OpenSUSE)。如果您从源代码重新构建boost,会发生什么? - Cubbi
Boost.Asio是仅包含头文件的,我怀疑重建boost也没有帮助。 - Sam Miller
再看了一遍:LINUX_VERSION_CODE 定义在 /usr/include/linux/version.h 中——也许服务器只是安装了错误的内核头文件。 - Cubbi
1
在更改了 /usr/include/linux/version.h 中的适当值后,asio 看起来正在使用 epoll。我有点担心调整这些值会产生其他副作用,但目前还好。尽管 asio 是仅头文件的库,但我可能会重建 boost。它确实需要 boost::system 库,并且可能会因此导致一些问题。感谢大家的帮助。 - Scott Lawson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接