免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1208 | 回复: 0
打印 上一主题 下一主题

linux 异步io(aio) 学习笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-14 00:04 |只看该作者 |倒序浏览

                异步io是相对于同步io而言,主要用于提高系统利用率,和提高程序效率,异步io(aio)成了proix得一个标准,在linux2.6中引入了aio这个概念。solaris,freebsd也都对此进行了支持。
同步io一般在读写文件时会一直等待,等读写完成后,执行下一条语句。异步io就不同了,在进行读写文件操作时,程序会继续执行别的操作,等读写完成后利用回调函数或者信号通知主函数。
下面是使用aio的例子程序
               
               
                #include stdio.h>
#include unistd.h>
#include aio.h>
#include string.h>
#include errno.h>
#include stdlib.h>
#define MAXBUF 256
#define BUFSIZE 20
struct aiocb my_aiocb;
int wait_aio(int fd)
{
        int ret;
        bzero((char *) &my_aiocb,sizeof(struct aiocb));
        my_aiocb.aio_buf = malloc(BUFSIZE+1);
        if (!my_aiocb.aio_buf) {
                perror("malloc");
        }
        my_aiocb.aio_fildes = fd;
        my_aiocb.aio_nbytes = BUFSIZE;
        my_aiocb.aio_offset = 0;
        异步读文件
        ret = aio_read(&my_aiocb);
        if ( ret  0 ) {
                perror("aio read");
        }
        如果正在读文件,一直循环等待,和同步io的效果差不多
        while (aio_return(&my_aiocb) == EINPROGRESS);
        if ( (ret=aio_return(&my_aiocb)) > 0 ) {
                printf("%s",my_aiocb.aio_buf);
        }
        else {
                perror("aio read");
        }
}
回调函数,把buffer的内容打印出来
int call_back_handler(sigval_t sigval)
{
        struct aiocb *req;
        req = (struct aiocb*)sigval.sival_ptr;
        printf("call back handler\n");
        printf("%s",req->aio_buf);
}
int call_back(int fd)
{
        int ret;
        bzero((char *) &my_aiocb,sizeof(struct aiocb));
        my_aiocb.aio_buf = malloc(BUFSIZE+1);
        my_aiocb.aio_fildes = fd;
        my_aiocb.aio_nbytes = BUFSIZE;
        my_aiocb.aio_offset = 0;
      
设置读写完成后事件的通知方式
        可以使用回调函数,和信号,这里使用回调函数方式
        my_aiocb.aio_sigevent.sigev_notify = SIGEV_THREAD;
        my_aiocb.aio_sigevent.sigev_notify_function = call_back_handler;
        my_aiocb.aio_sigevent.sigev_notify_attributes = NULL;
        my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;
        printf("aio_read\n");
        ret = aio_read(&my_aiocb);
        if ( ret  0 ) {
                perror("aio read");
        }
}
int main(int argc,char** argv)
{
        char filename[MAXBUF];
        int fd;
//      strcpy(argv[1],filename);
        fd=open("test.txt",O_RDONLY);
        if ( fd  0 ) {
                return -1;
        }
调用等待方式
        wait_aio(fd);
调用回调函数方式
        call_back(fd);
}
程序在编译时需要runtime库支持,不知道这个库是否支持嵌入式平台,回来可以试试,还有一种信号方式,明天再写吧
gcc -o test_aio test_aio.o -lrt
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/58855/showart_1899693.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP