#include <aio.h> /* 函数名 :int aio_write(struct aiocb *aiocbp) 参 数 :struct aiocb *aiocbp 返回值 :执行成功返回0,出错返回-1,并设置errno的值 说 明 :请求对一个有效的文件描述符进行异步读操作, 这个文件描述符可以表示一个文件、套接字甚至管道 */ int aio_write(struct aiocb *aiocbp); /* 函数名 :int aio_read(struct aiocb *aiocbp) 参 数 :struct aiocb *aiocbp 返回值 :执行成功返回0,出错返回-1,并设置errno的值 说 明 :请求对一个有效的文件描述符进行异步写操作, 这个文件描述符可以表示一个文件、套接字甚至管道 */ int aio_read(struct aiocb *aiocbp); /* 函数名 :int aio_error(struct aiocb *aiocbp) 参 数 :struct aiocb *aiocbp 返回值 :EINPROGRESS:说明请求尚未完成 ECANCELLED:说明请求被应用程序取消 说 明 :被用来确定请求状态 */ int aio_error(struct aiocb *aiocbp);
/* 函数名 :int aio_return(struct aiocb *aiocbp) 参 数 :struct aiocb *aiocbp 返回值 : 说 明 :1、异步I/O和标准I/O方式之间的另外一个区别是:不能立即访问这个函数的返回状态, 因为异步I/O并没有阻塞在read()调用上。 2、在标准的read调用中返回状态时:在该函数返回时提供的 3、但是在异步I/O中,我们要使用aio_return函数 */ ssize_t aio_return(struct aiocb *aiocbp); /* 函数名 :int aio_suspend(const struct aiocb *const list[],int nent,const struct timespec *timeout); 参 数 :struct aiocb *aiocbp 返回值 : 说 明 :挂起调用进程直到IO完成或时间到期 用户可以使用aio_suspend()函数来挂起或阻塞掉用进程,直到异步请求完成为止, 此时产生一个信号,或者在发生其他超时操作时会导致aio_suspend()返回 */ int aio_suspend(const struct aiocb *const list[],int nent,const struct timespec *timeout); /* 函数名 :int aio_cancel(int fd,struct aiocb *aiocbp); 参 数 :struct aiocb *aiocbp 返回值 : 说 明 :允许用户取消对某个文件描述符执行的一个或所有的I.O请求 用户需要提供一个aiocb指针,如果这个请求被成功取消, 1、那么这个函数就会返回AIO_CANCELED, 2、如果请求完成,此函数就会返回AIO_TCANCELED 3、aiocbp参数设置为NULL,如果所有的请求都被取消了,这个函数将返回AIO_CANCELED, 4、如果至少有一个请求被取消,那么这个函数就会返回AIO_NOT_CANCELED 5、如果一个也没被取消就会返回AIO_ALLODNOE */ int aio_cancel(int fd,struct aiocb *aiocbp); /* 函数名 :int lio_listio(int mode,struct aiocb *restrict const list[restrict],int nent,struct sigevent *restrict notification); 参 数 :int mode -- mode参数可以是LIO_WAIT或LIO_NOWAIT -- LIO_WAIT会阻塞这个调用,直到所有的I/O都完成为止 -- LIO_NOWAIT立即返回 参 数 :list -- aiocb的引用列表 参 数 :nent -- 最大元素个数 返回值 :正在进行IO操作返回EINPROGRESS 说 明 : */ int lio_listio(int mode,struct aiocb *restrict const list[restrict],int nent,struct sigevent *restrict notification);
struct aiocb{ int aio_filds; //要被读写的fd off_t aio_offset; //读写操作对应的内存buffer volatile void *aio_buf;//读写操作对应的文件偏移 size_t aio_nbytes; //需要读写的字节长度 int aio_reqprio; //请求的优先级 struct sigevent aio_sigevent; //异步事件,定义异步操作完成时的通知信号或回调函数 int aio_lio_opcode; };
struct sigevent{ union sigval sigev_value; int sigv_signo; int sigev_notify;//异步事件的通知类型 SIGEV_NONE(不通知)、SIGEV_SIGNAL(生成信号)、SIGEV_THREAD(执行sigev_notify_function指定的函数) void (*sigev_notify_function) (union sigval); pthread_attr_t *sigev_notify_attrbutes;