linux提供了异步读写磁盘文件的接口,需要先安装libaio(centos上,yum install libaio),才能使用头文件libaio.h;异步IO可以通过eventfd与epoll结合,进而在事件驱动框架中使用。
linux native aio需要针对使用O_DIRECT
标识打开的文件,造成如下限制(如果无O_DIRECT
标识,在调用io_submit时,会同步完成IO操作):
- AIO方式(O_DIRECT导致)读写文件时,无法利用操作系统对文件的缓存,只能从磁盘读写
- 读写缓冲区的地址、读写内容的大小、读写的文件偏移必须是扇区的倍数(通常是512字节)
例子:
test_aio.c
#include<libaio.h>
#include<stdlib.h>
#include<errno.h>
#include<stdio.h>
#include<unistd.h>
#define __USE_GNU 1
#include<fcntl.h>
#define FILEPATH "./test.txt"
int main()
{
io_context_t context ;
unsigned nr_events = 10;
struct iocb io[2], *p[2]={&io[0], &io[1]};
struct io_event