三步走:创建一个实例epoll_create,控制 epoll_ctl,最后查看监视结果 epoll_wait
poll与epoll()的区别,一个是linux方言版本. poll建立一个数组,在用户态下自己管理数组,完成各种行为的指定、获取;而epoll在kernel态下管理这么一个数组,管理文件描述符,关心的事件,返回的事件,提供系统调用,方法,封装了一层。
int epoll_create(int size)size 可以理解成数组的大小,常规的数值。?
int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event)
op:想做什么:添加/修改/删除
fd:对象
event:针对的事件
`int epoll_wait(int epfd,struct epoll_event *events, int maxevents,int timeout);
maxevents 可以连续取很多事件 放到该数组当中
#include<sys/epoll.h>
static relay()
{
struct epoll_event ev;
epfd=epoll_create(10);
//如果失败了
if(epfd<0)
{
perror("epoll_create()");
exit(1);
}
ev.events =0; //暂时没有行为,第一个成员
ev.data.fd=fd1; //第二个成员
epoll_ctl(epfd,EPOLL_CTL_ADD,fd1,&ev);
//把数据传递给内核
ev.events=0;
ev.data.fd=fd2;
epoll_ctl(epfd,EPOLL_CTL_ADD,fd2,&ev);
while(fsm12.state !=STATE_T||fsm21.state!=STATE_T)
{
//布置监视任务
//fd1事件的修改
ev.data.fd = fd1;
ev.events =0;
if(fsm12.state == STATE_R)
ev.events |= EPOLLIN;
if(fsm21.state == STATE_W)
ev.events |= EPOLLOUT;
epoll_ctl(epfd,EPOLL_CTL_MOD,fd1,&ev);
//监视
if(fsm12.state<STATE_AUTO ||)
{
while(epoll_wait(epfd,&ev,1,-1))//死等
{
if(errno )
perror
exit
}
}
//查看当前结果
if(ev.data.fd ==fd1 &&ev.events &EPOLLIN||ev.data.fd==fd2&&ev.events &EPOLLOUT||fsm12.state>STATE_AUTO)
//文件描述符1可读
fsm_driver(&fsm12);
}
//最后关闭
close(epfd);
}events:
- epoll的精华所在 设立的 epoll_data_t data; 而 epoll_data_t 是一个union

- void * 最好用的数据类型。关联到树 ,存树的节点