异步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
|
阅读(456) | 评论(0) | 转发(0) |