主要欣赏 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;
}

本文通过一个小例子展示了Linux下aio_suspend()函数如何挂起进程直至异步I/O请求完成,并对比了Linux与Java中异步I/O的设计亮点。
877

被折叠的 条评论
为什么被折叠?



