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

如何实现异步非阻塞io.

    来源: 互联网  发布时间:2016-07-07

    本文导语:  如下代码,在键盘没有输入的时候select处于阻塞状态.  但根据网上的文章的描述,非阻塞异步io在等待io的过程中,进程可以做其它事情,而不是干巴巴地等待io的就绪。 所以我想知道,下面的代码如何更改才能实现...

如下代码,在键盘没有输入的时候select处于阻塞状态. 
但根据网上的文章的描述,非阻塞异步io在等待io的过程中,进程可以做其它事情,而不是干巴巴地等待io的就绪。
所以我想知道,下面的代码如何更改才能实现异步非阻塞? 如何实现在等待io的时候进行别的操作?


#include 
#include 
#include 
#include 
#include 
#include 

int
main ()
{
    int keyboard;
    int ret, i, cnt;
    char c;
    fd_set readfd;
    struct timeval timeout;
    keyboard = open("/dev/tty", O_RDONLY | O_NONBLOCK);
    assert(keyboard>0);
/*    
    while(1)
    {
        i = read(keyboard, &c, 1);
        printf("%c n", c);
    }
*/

    cnt = 0;
    while(1) {
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
        FD_ZERO(&readfd);
        FD_SET(keyboard, &readfd);
        printf("waiting for io ...n");
        ret = select(keyboard+1, &readfd, NULL, NULL, /*&timeout*/ NULL); //blocked without timeout
        if(FD_ISSET(keyboard, &readfd)) {
                printf("%dn", ++cnt);
            i = read(keyboard, &c, 1);
                printf("read out:%dn", i);
            if('n' == c)
                continue;
            //printf("the input is %cn",c);
            if ('q'==c)
                break;
        }
    }

}

|
异步IO与select,信号驱动IO不是一回事。
异步IO是完成时再通知,所以icop叫完成端口。
信号IO是发生时通知。之后事情要自己处理。
异步IO要用aio函数。 
boost的asio是异步IO。
windows 的iocp是异步IO。
其实,多开一个线程进行select上的纯IO操作,就是异步IO了。

|
select实现不了异步非阻塞IO,异步非阻塞是要信号机制。

|
另外开一个线程好了,select阻塞住的时候,另一个线程还可以工作啊!

|
linux下也有异步IO的函数库,楼主可以参考一下poll,aio_read,aio_write等函数

|
好像异步IO需要修改系统设置,一般linux系统默认不开这功能~

    
 
 

您可能感兴趣的文章:

  • struts+spring+hibernate+jquery实现分页功能的几个基本类介绍(异步加载)
  • 纯异步的Server简单实现 Server
  • Linux下多进程实现异步编成,高手帮忙!
  • UNIX下如何实现串口异步通信?
  • php 异步请求文件实现多线程的代码
  • jquery ajaxSubmit 异步提交的简单实现
  • 请教高手:如何实现异步程序?
  • php 伪异步执行实现方法
  • python实现Linux异步epoll代码
  • Android加载对话框同时异步执行实现方法
  • Linux上的客户端异步通知型Socket怎么实现?
  • c#异步读取数据库与异步更新ui的代码实现
  • python实现异步回调机制代码分享
  • 基于使用BeginInvoke,EndInvoke异步调用委托的实现代码
  • 使用jquery.upload.js实现异步上传示例代码
  • 跨平台python异步回调机制实现和使用方法
  • PHP多线程异步请求的3种实现方法
  • 实现PHP多线程异步请求的3种方法
  • 创建父子进程,实现异步并发,这段代码对吗?
  • PHP异步调用实现方式详解
  • php 异步调用方法实现示例
  • select如何实现发送的阻塞和解除阻塞?
  • 如何实现一次非阻塞的串口写?
  • 请教大家:有关阻塞模式的实现
  • stdio和read/write,缓冲区写满时阻塞的实现机制是什么
  • 哪位为高手能解释一下 NIO(非阻塞的IO)的实现原理?谢谢!
  • 我需要一个模型,在 LINUX C 下。实现线程间的控制,执行,阻塞,再执行。。。。。不知道如何实现。
  • unix环境高级编程 第十章十九节sleep函数实现为什么要先阻塞SIGALRM?
  • python实现AutoResetEvent类的阻塞模式方法解析
  • 如何使用shell脚本实现监控程序消息队列阻塞情况?
  • linux下怎么实现等待一个标志位为1前,一直睡眠(阻塞)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • socket.io的抽象实现 engine.io
  • Socket.IO服务器端实现 socketio-netty
  • iOS 的 Canvas 和 Audio 实现 Ejecta
  • Help : 这种情况怎样才能实现(关于IO类)
  • 用JAVA的IO怎么实现图形文件(GIF/JPG)的读写,100分奉送!
  • Java IO文件编码转换实现代码
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • NOSQL iis7站长之家
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • boost unordered_map和std::list相结合的实现LRU算法
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • linux下如实现与window下的驱动器实现文件共享??
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • qt如何实现:操作键盘实现数据的滚动?
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?


  • 站内导航:


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

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

    浙ICP备11055608号-3