Linux入门教程

2019-10-18 20:31栏目:网络时代
TAG:

  1. 联机阻塞I/O: 顾客进度张开I/O操作,一贯不通到I/O操作完结收尾。

  2. 一同非阻塞I/O: 客户程序能够经过设置文件陈诉符的属性O_NONBLOCK,I/O操作能够立刻回去,然而并不保障I/O操作成功。

  3. 异步事件阻塞I/O: 顾客进程可以对I/O事件开展围堵,不过I/O操作并不封堵。通过select/poll/epoll等函数调用来完成此目标。

  4. 异步时间非阻塞I/O: 也叫做异步I/O(AIO),顾客程序能够通过向基础发出I/O需要命令,不用等带I/O事件真的爆发,能够继续做

除此以外的政工,等I/O操作达成,内核会通过函数回调可能时限信号机制公告客商进度。这样相当大程度提升了系统吞吐量。

上边就AIO做详细介绍:

要利用aio的功能,须求include头文件aio.h,在编译连接的时候必要投入POSIX实时增添库rt.上面就aio库的接纳做牵线。

  1. AIO整个进度所选用的数据寄放在三个结构体中,struct aiocb,aio control block.看看头文件中的定义:

/* Asynchronous I/O control block. */

struct aiocb

{

int aio_fildes; /* File desriptor. */ 需求在哪些文件陈述符上进行I/O

int aio_lio_opcode; /* Operation to be performed. */ 那么些是指向批量I/O的状态使得,读写操作类型

int aio_reqprio; /* Request priority offset. */ 央浼优先级(If _POSIX_澳门新葡亰平台游戏,PRIORITIZED_澳门新葡亰平台官网,IO is defined, and this file supports it, then the

asynchronous operation is submitted at a priority equal to that of the

calling process minus aiocbp-》aio_reqprio.)

volatile void *aio_buf; /* Location of buffer. */ 具体内容,数据缓存

size_t aio_nbytes; /* Length of transfer. */ 数据缓存的长度

struct sigevent aio_sigevent; /* Signal number and value. */ 用于异步I/O达成后的通报。

里头得以完毕利用的数额成员。

/* Internal members. */

struct aiocb *__next_prio;

int __abs_prio;

int __policy;

int __error_code;

__ssize_t __return_value;

#ifndef __USE_FILE_OFFSET64

__off_t aio_offset; /* File offset. */

char __pad[sizeof (__off64_t) - sizeof (__off_t)];

#else

__off64_t aio_offset; /* File offset. */ 文件读写偏移

#endif

char __unused[32];

};

  1. int aio_read(struct aiocb *aiocbp);

异步读操作,向基础发出读的指令,传入的参数是三个aiocb的布局,比如

struct aiocb myaiocb;

memset(&aiocb , 0x00 , sizeof(myaiocb));

myaiocb.aio_fildes = fd;

myaiocb.aio_buf = new char[1024];

myaiocb.aio_nbytes = 1024;

if (aio_read(&myaiocb) != 0)

{

printf(“aio_read error:%sn” , strerror(errno));

return false;

}

  1. int aio_write(struct aiocb *aiocbp);

异步写操作,向基础发出写的一声令下,传入的参数仍然为叁个aiocb的结构,当文件描述符的O_APPEND

标识位设置后,异步写操作总是将数据增加到文件末尾。若无设置,则增添到aio_offset指定的

地方,比如:

struct aiocb myaiocb;

memset(&aiocb , 0x00 , sizeof(myaiocb));

myaiocb.aio_fildes = fd;

myaiocb.aio_buf = new char[1024];

myaiocb.aio_nbytes = 1024;

myaiocb.aio_offset = 0;

if (aio_write(&myaiocb) != 0)

{

printf(“aio_read error:%sn” , strerror(errno));

return false;

}

澳门新葡亰平台游戏 1

版权声明:本文由澳门新葡亰平台游戏发布于网络时代,转载请注明出处:Linux入门教程