当前位置:  技术问答>linux和unix

Linux下,Boost.Asio是如何通过epoll做到IO异步的

    来源: 互联网  发布时间:2017-05-16

    本文导语:  背景:epoll的实现是基于回调的,如果fd有期望的事件发生就通过回调函数将其加入epoll就绪队列中,用户针对该队列中的文件句柄发起相应操作,如read等,此时数据真正才会开始从内核buffer写入应用buffer中,整个过程是一种同...

背景:epoll的实现是基于回调的,如果fd有期望的事件发生就通过回调函数将其加入epoll就绪队列中,用户针对该队列中的文件句柄发起相应操作,如read等,此时数据真正才会开始从内核buffer写入应用buffer中,整个过程是一种同步IO。而Boost.Asio采用Proactor模式实现了异步IO,也就是说用户在发起async_read后,可以去进行其它操作,内核将数据从内核buffer写入应用buffer,最后会通知其数据已经拷贝完毕。
问题:Boost.Asio在Linux下封装epoll这种同步接口是如何做到异步IO的。看了源代码,有async_read,但没有看出其中的奥妙,请指点,谢谢

|
看io_service类里的成员impl_, 贴几段代码你应该就明白了,

// io_service.hpp
typedef class task_io_service io_service_impl;
...
class io_service: private noncopyable
{
private:
  typedef detail::io_service_impl impl_type;
  ...
  impl_type& impl_;
};


// detail/task_io_service.hpp
#include 
...
class task_io_service
  : public boost::asio::detail::service_base
{
  ...
  reactor* task_;
  ...
};



// detail/reactor_fwd.hpp
typedef class epoll_reactor reactor;



// detail/epoll_reactor.hpp
class epoll_reactor
  : public boost::asio::detail::service_base
{
  ...
private:
  ...
BOOST_ASIO_DECL static int do_epoll_create();
  ...
};



// detail/impl/epoll_reactor.ipp
int epoll_reactor::do_epoll_create()
{
  ...
  if (fd == -1 && (errno == EINVAL || errno == ENOSYS))
  {
    fd = epoll_create(epoll_size);
    if (fd != -1)
      ::fcntl(fd, F_SETFD, FD_CLOEXEC);
  }
  ...
  return fd;
}


detail/impl/epoll_reactor.ipp 里有很多epoll的封装

    
 
 

您可能感兴趣的文章:

  • Linux 中关于异步函数的问题
  • ACE linux下的异步IO
  • linux进程异步通信,高手请进
  • Linux下多进程实现异步编成,高手帮忙!
  • 初学者关于linux驱动异步通知的小问题
  • python实现Linux异步epoll代码
  • 请问Linux下C++编程有没有类似WSAEventSelect的异步模型
  • Linux上的客户端异步通知型Socket怎么实现?
  • 请问:Linux 串口编程 非阻塞异步模式 write没有数据
  • linux环境下父进程子进程异步问题
  • 如何做到linux和win2000的双引导呢???
  • linux中的用户,用什么命令修改密码(要一条命令做到)???
  • linux技术能做到40岁?
  • 请问如何做到redhat fedora core2和redhat linux enterprise 3 AS共存,谢谢
  • 据说linux分区只能在前8G,40G的硬盘分区先装windows怎么做到呢?
  • Window可以生成可执行文件的map(函数的入口地址表),Linux怎么做到这一点?详情请进!
  • linux下如何做到从键盘输入字符不显示问题
  • 开始做Linux驱动了,三年的时间能做到什么样?大牛们请答话
  • Linux中的资源管理器对移动磁盘的插入检测是怎么做到的呢?
  • 做unix/linux真得是“越老越值钱”(即重视经验)吗?真得可以做到60岁吗?
  • 用SecureCRT或Putty 远程启动linux服务器上的一个应用程序,但是当我关掉SecureCRT的时候,应用程序也被关掉了,怎么能够做到我关闭客户
  • 怎样做到windows和linux双启动
  • 随着LINUX的启动,打开一个终端显示TOMCAT的日志文件,请问如何做到?
  • 急救:无盘Linux做到了“booting the kernel...”之后不动了
  • 如何做到linux下opencv程序的静态编译
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下通过crond实现自动执行程序
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • 如何通过 Docker 在 Linux 上托管 .NET Core
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • Linux下通过rpm安装软件详细介绍以及如何将软件安装到指定目录
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户 100分相赠
  • linux下能通过ip地址ping通其它机器,通过计算机名ping不通怎么解决?
  • 工作站Redhat Linux7.2如何通过NT4.0 proxy代理服务器上网,我不能通过其验证!请高手指点思路和方法!
  • 书写基于Linux内核的键盘记录器(Writing Linux Kernel Keylogger)中的源码如何编译通过???
  • 我没有linux安装光盘!可不可以通过网络在我的电脑上安装一个linux操作系统!
  • vmware装的linux,通过win2000访问linux的web服务器有问题
  • 98的机子有modem,linux的无,能否通过共享使linux的机子都能上网?
  • codeblocks8.02 for linux,程序可以编译通过,但是通过右键“查找fopen函数的声明”或“实现”,都是提示“没有找到:fopen”,为什么
  • Linux g++编译调用模板函数的类不通过,但是VC2005通过
  • linux能够通过执行脚本添加oracle数据库的用户吗
  • 我刚安装了Linux,但我不知道如何才能通过Moden上网呢?
  • linux如何通过SyGate服务器上网?
  • linux通过局域网上internet
  • 请问通过什么来管理linux服务
  • window下通过ftp执行linux脚本?
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3