打印
[boot]

Linux-异步IO

[复制链接]
458|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蒋博1026|  楼主 | 2019-8-18 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.何为异步IO
(1).几乎可以这么认为:异步IO就是操作系统用软件实现的一套中断响应系统.
(2).异步IO的工作方法:我们当前进程注册一个异步IO事件(使用signal注册一个信号SIGIO的处理函数),然后当前进程可以正常处理自己的事情,当异步事件发生后当前进程会收到一个SIGIO信号从而执行绑定的处理函数去处理这个异步事件.
2.涉及的函数:
(1).fcntl(F_GETFL\F_SETFL\O_ASYNC\F_SETOWN)
(2).signal或者sigaction(SIGIO)
3.代码实例:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <signal.h>
int mousefd = -1;
//绑定到SIGIO信号,在函数内处理异步通知事件
void func(int sig)
{
    char buf[200];
    if(sig != SIGIO)
        return;
    memset(buf, 0, sizeof(buf));
    read(mousefd, buf, 2);
    printf("读出的鼠标:[%s]\n",buf);
}
int main(void)
{
    int flag = -1;
    char buf[100];
    mousefd = open("/dev/input/mouse0",O_RDONLY);
    if(mousefd < 0)
    {
        perror("open:");
        return -1;
    }
   
    //注册异步通知(把鼠标的文件描述符设置为可以接受异步IO)
    flag = fcntl(mousefd, F_GETFL);
    flag |= O_ASYNC;
    fcntl(mousefd, F_SETFL, flag);
   
    //把异步IO事件的接收进程设置为当前进程
    fcntl(mousefd, F_SETOWN, getpid());   
   
    //注册当前进程的SIGIO信号捕获函数
    signal(SIGIO, func);
   
    //读键盘
    while(1)
    {
        memset(buf, 0, sizeof(buf));
        read(0, buf, 5);
        printf("读出的键盘:[%s]  \n",buf);        
    }
    return 0;
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

323

主题

1820

帖子

18

粉丝