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

来源:互联网 发布:淘宝付款方式有几种 编辑:程序博客网 时间:2024/05/04 22:39

主要欣赏 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模型

0 0
原创粉丝点击