nginx 事件驱动异步AIO使用情况

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);	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值