何为异步IO?

(1)几乎可以认为:异步IO就是操作系统用软件实现的一套中断响应系统。
(2)异步IO的工作方法是:我们当前进程注册一个异步IO事件(使用signal注册一个信号

SIGIO的处理函数),然后当前进程可以正常处理自己的事情,当异步事件发生后当前进

程会收到一个SIGIO信号从而执行绑定的处理函数去处理这个异步事件。其实所有的信号

都是软件实现的一种中断机制,所以异步IO其实就是利用了信号这种软件中断机制来工作

的,工作流程如下:
1):设置设备文件fd具有接收IO的功能
2):设置异步IO事件的接收进程
3):注册信号处理函数(也就是绑定)

涉及的函数:
(1)fcntl(F_GETFL、F_SETFL、O_ASYNC、F_SETOWN)
F_GETFL:获取设备文件fd的操作属性
F_SETFL:设置设备文件fd的操作属性
O_ASYNC:用来设置fd具有可接收异步IO信号的功能
F_SETOWN:设置异步IO事件的接收进程
(2)signal或者sigaction(SIGIO)

示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>

#define FILE "/dev/input/mouse0"

static int fd = -1;

static inline void funcIO(int sig);

int main(void)
{
int flag = -1;
int sig_ret = -1;
int read_ret = -1;
char buf[100] = {0};
struct sigaction sig = {
.sa_handler = funcIO,
};

//打开设备文件
fd = open(FILE, O_RDONLY);
if (-1 == fd)
{
perror("open error");
exit(-1);
}

//把鼠标的fd设置为可接收异步IO信号
flag = fcntl(fd, F_GETFL); //读出fd的属性
flag |= O_ASYNC; //添加O_ASYNC属性,使之具有可接收异步IO信号
fcntl(fd, F_SETFL, flag); //设置属性

//设置当前进程为异步IO事件的接收进程
fcntl(fd, F_SETOWN, getpid());

//绑定异步IO事件处理函数
sig_ret = sigaction(SIGIO, &sig, NULL); //表示不获取旧的处理函数
if (-1 == sig_ret)
{
perror("sigaction error");
exit(-1);
}

/*
//键盘以阻塞的方式
read(0, buf, sizeof(buf)/2);
printf("读出的键盘的数据: %s.\n", buf);
*/

while (1)
{
memset(buf, 0, sizeof(buf));
read_ret = read(0, buf, sizeof(buf)/2);
if (0 < read_ret)
{
printf("读出的键盘的数据: %s.\n", buf);
}
}

//关闭文件描述符
close(fd);

return 0;
}

static inline void funcIO(int sig)
{
char buf[100] = {0};

if (SIGIO != sig)
return;
read(fd, buf, sizeof(buf)/2);
printf("读出的鼠标的数据: %s.\n", buf);
}

异步IO原理及相应函数的更多相关文章

  1. Node.js异步IO原理剖析

    为什么要异步I/O? 从用户体验角度讲,异步IO可以消除UI阻塞,快速响应资源 JavaScript是单线程的,它与UI渲染共用一个线程.所以在JavaScript执行的时候,UI渲染将处于停顿的状态 ...

  2. 第十七章-异步IO

    异步IO的出现源自于CPU速度与IO速度完全不匹配 一般的可以采用多线程或者多进程的方式来解决IO等待的问题 同样异步IO也可以解决同步IO所带来的问题 常见的异步IO的实现方式是使用一个消息循环, ...

  3. Linux 网络编程的5种IO模型:异步IO模型

    Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信 ...

  4. Windows内核原理-同步IO与异步IO

    目录 Windows内核原理-同步IO与异步IO 背景 目的 I/O 同步I/O 异步I/O I/O完成通知 总结 参考文档 Windows内核原理-同步IO与异步IO 背景 在前段时间检查异常连接导 ...

  5. 自己动手写个异步IO函数 --(基于 c# Task)

    前言    对于服务端,达到高性能.高扩展离不开异步.对于客户端,函数执行时间是1毫秒还是100毫秒差别不大,没必要为这一点点时间煞费苦心.对于异步,好多人还有误解,如: 异步就是多线程:异步就是如何 ...

  6. java的高并发IO原理,阻塞BIO同步非阻塞NIO,异步非阻塞AIO

    原文地址: IO读写的基础原理 大家知道,用户程序进行IO的读写,依赖于底层的IO读写,基本上会用到底层的read&write两大系统调用.在不同的操作系统中,IO读写的系统调用的名称可能不完 ...

  7. Mina、Netty、Twisted一起学(九):异步IO和回调函数

    用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,例如Ajax.jQuery的动画等. $.get(url, function() { ...

  8. 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

    完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...

  9. Python - 异步IO\数据库\队列\缓存

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,协程一定是在单线程运行的. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和 ...

随机推荐

  1. vs2013 乱码问题

    单击一下代码框  然后点文件  有个高级保存选项  改成utf-8  就可以显示中文了

  2. 每日一条 git 命令行:git clone https://xxxxx.git -b 12.0 --depth 1

    每日一条 git 命令行:git clone https://xxxxx.git -b 12.0 --depth 1 -b 12.0:分支 12.0 --depth 1:depth 克隆深度,1 为最 ...

  3. 解决 eclipse tomcat cannot create a server using the selected type

    解决的方法 1.退出eclipse: 2.打开 [工程目录下]/.metadata/.plugins/org.eclipse.core.runtime/.settings目录: 3.删除org.ecl ...

  4. hadoop启动时,报ssh: Could not resolve hostname xxx: Name or service not known

    本文转载自:http://blog.csdn.net/wodewutai17quiet/article/details/76795951 问题:hadoop启动时,报ssh: Could not re ...

  5. (转)如何实现CSS限制字数,超出部份显示点点点...

    <div style="width:200px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis; border:1 ...

  6. CentOS防火墙中端口的开启和关闭

    1.开启端口(以80端口为例) 方法一: /sbin/iptables -I INPUT -p tcp --dport -j ACCEPT 写入修改 /etc/init.d/iptables save ...

  7. PhpStorm 配置在浏览器中打开文件

    这东东中文资料太少- -鼓捣了好久才有结果 点击File-Settings-Deployment .点+按钮增加服务器 Mapping 设置工程路径等 点击 Edit Confi 这东东中文资料太少- ...

  8. Custom Exception in ASP.NET Web API 2 with Custom HttpResponse Message

    A benefit of using ASP.NET Web API is that it can be consumed by any client with the capability of m ...

  9. python Flask篇(一)

    MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  10. uwsgi的python2+3多版本共存实操使用virtualenv

    1首先,机器需要有python2和python3的可执行环境.确保pip和pip3命令可用.原理就是在哪个环境下安装uwsgi.uwsgi启动的时候,就用的哪个python版本 2安装virtuale ...