Chinaunix首页 | 论坛 | 博客
  • 博客访问: 476746
  • 博文数量: 58
  • 博客积分: 6047
  • 博客等级: 准将
  • 技术积分: 838
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-06 21:05
文章分类

全部博文(58)

文章存档

2009年(24)

2008年(34)

我的朋友

分类: LINUX

2009-04-14 00:04:07

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

阅读(5371) | 评论(0) | 转发(1) |
0

上一篇:awk的高级技巧

下一篇:亚马逊商品推荐

给主人留下些什么吧!~~