https://blog.csdn.net/lyh__521/article/details/50300379
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <libaio.h>
#include <errno.h>
#include <sys/epoll.h>
#include <sys/eventfd.h>
#include <stdlib.h>
void cf(io_context_t ctx, struct iocb * iocb, long res, long res2);
int main()
{
int epfd;
int evfd;
int fd;
io_context_t ctx;
void *buff;//缓冲区
struct epoll_event ev_event;
struct epoll_event events_list[1024];
struct iocb cb;//定义一个异步io事件结构体
struct iocb *pcbs[1];
int n;
uint64_t ready;//事件驱动
struct io_event* events_ret; //获取事件数组
epfd=epoll_create(1024);
fd=open("1.txt",'r');
if (fd == -1)
{
printf("file open error");
}
evfd=eventfd(0,0);
ev_event.events = EPOLLIN | EPOLLET;
ev_event.data.ptr = NULL;
epoll_ctl(epfd,EPOLL_CTL_ADD,evfd,&ev_event);
ctx=0;
if(io_setup(1024,&ctx)!=0)
{
perror("io_setup");
exit(-1);
}
posix_memalign(&buff,512,1024);
memset(&cb,'\0',sizeof(struct iocb));
int* object = (int*)malloc(4);
*object=0;
cb.data=(void*)object;
printf("%p",cb.data);
io_prep_pread(&cb,fd,buff,1024,0);
io_set_eventfd(&cb,evfd);
io_set_callback(&cb,cf);
printf("%p",cb.data);
pcbs[0]=&cb;
if(io_submit(ctx,1,pcbs)!=1)
{
exit(-1);
}
while(1)
{
n=epoll_wait(epfd,events_list,32,-1);
if(n <= 0)
{
if(errno== EINTR)
exit(-1);
}
else
break;
}
n=read(evfd,&ready,sizeof(ready));
if(n!=8)
{
exit(-1);
}
events_ret=(struct io_event*)malloc(sizeof(struct io_event)*32);
n= io_getevents(ctx,1,32,events_ret,0);
((io_callback_t)(events_ret[0].data))(ctx,events_ret[0].obj,events_ret[0].res,events_ret[0].res2);
return 0;
}
void cf(io_context_t ctx,struct iocb *iocb,long res,long res2)
{
printf("%d,%d",iocb->u.c.nbytes,res);
printf("%s",iocb->u.c.buf);
printf("%p",iocb->data);
}