您的位置:首页 > 运维架构 > Linux

Linux I/O模型 与 Java I/O模型、驱动中的异步函数 的区别。

2016-05-23 22:14 555 查看
主要欣赏 Linux 异步I/O 与 Java 的 异步 I/O 设计的精彩之处。

Linux 异步IO

1 : aio_suspend()



它会挂起调用的进程,直到异步的请求完成,数组中的任何一个异步I/O请求完成,aio_suspend都会返回。

那么,下面的一个小例子来实验 验证。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
?#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <aio.h>

#define BUFFER_SIZE 1024
#define MAX 2
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)

int main(void)
{
struct aiocb lee_aiocb,lee_aiocb2;
const struct aiocb * cblist[MAX];
int fd ;
fd = open("/dev/input/event2",O_RDWR);
if(fd < 0){
ERR_EXIT("open");
}

memset(&my_aiocb,0,sizeof(lee_aiocb));
memset(&my_aiocb2,0,sizeof(lee_aiocb2));
memset(cblist,0,sizeof(cblist));

cblist[0] = &lee_aiocb;
cblist[1] = &lee_aiocb2

lee_aiocb.aio_fildes = fd;
lee_aiocb.aio_nbytes = BUFFER_SIZE;
lee_aiocb.aio_offset = 0;
lee_aiocb.aio_buf = malloc(BUFFER_SIZE + 1 );
if(!lee_aiocb.aio_buf){
ERR_EXIT("malloc");
}
lee_aiocb2.aio_fildes = 0;        // 0 标准输入
lee_aiocb2.aio_nbytes = BUFFER_SIZE;
lee_aiocb2.aio_offset = 0;
lee_aiocb.aio_buf = malloc(BUFFER_SIZE + 1);
if(!lee_aiocb.aio_buf){
ERR_EXIT("malloc");
}

ret = aio_read(&lee_aiocb);
if(ret < 0){
ERR_EXIT("aio_read");
}

aio_read(&lee_aiocb2);

printf("before aio_suspend\n");

ret = aio_suspend(cblist,2,NULL);
if(ret < 0){
.......
}
printf("after aio_suspend\n");
close(fd);
return 0;
}


IO多路复用模型

信号驱动IO模型

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: