Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3220421
  • 博文数量: 1805
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 20:01
文章分类

全部博文(1805)

文章存档

2017年(19)

2016年(80)

2015年(341)

2014年(438)

2013年(349)

2012年(332)

2011年(248)

分类: LINUX

2013-03-02 08:40:20

异步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

阅读(423) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~