您的位置:首页 > 编程语言

基于视频压缩的实时监控系统-A4:main.c代码解析

2017-04-09 16:39 791 查看
#include <main.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/epoll.h>
#include <sys/stat.h>
#include <stdbool.h>

//为epoll_event 结构体附加一个结构体
struct event_ext
{
int fd;
bool epolled;
uint32_t events;
void (*handler) (int fd,void *arg);
void *arg;
};

/*
*函数功能:创建一个事件附加结构
*/
struct event_ext *epoll_event_creat(int fd,uint32_t type,void (*handler)(int,void*),void *arg)
{
struct event_ext *e;
e = calloc(1,sizeof(struct event_ext));    //为结构体分配空间

e->fd = fd;                               //初始化结构体
e->events = type;
e->handler = handler;
e->arg = arg;
return e;
}

/*
*函数功能:添加事件到epoll
*/
int epoll_add_event(int epfd,struct event_ext *ev)
{
struct epoll_event epv;
int op;

//初始化epoll_event,并将附加结构挂载在epoll_event
epv.data.ptr = ev;
epv.events = ev->events;
if(ev->epolled)            //true    修改事件
{
op = EPOLL_CTL_MOD;
}
else                      //false   添加事件
{
op = EPOLL_CTL_ADD;
ev->epolled = true;
}
//将epoll_event 加入 epoll池
epoll_ctl(epfd,op,ev->fd,&epv);
}

/*
*函数功能:从epoll删除事件
*/
int epoll_del_event(int epfd,struct event_ext *ev)
{
epoll_ctl(epfd,EPOLL_CTL_DEL,ev->fd,NULL);
ev->epolled = false;
return 0;
}
int main()
{
int fds;
int i;
struct epoll_event events[512];
uint32_t event;
struct event_ext *e;
//分配空间
srv_main = calloc(1,sizeof(struct server));
//创建epoll
srv_main->epfd = epoll_create(512);
//加入事件
srv_main->cam = cam_sys_init();
srv_main->srv = net_sys_init();
//等待事件发生且处理
while(1)
{
fds = epoll_wait(srv_main->epfd,events,512,1000);    //等待1000ms
for(i=0;i<fds;i++)
{
event = events[i].events;
e =  events[i].data.ptr;
if(event & EPOLLIN)
{
e->handler(e->fd,e->arg);

}
if(event & EPOLLOUT)
{
e->handler(e->fd,e->arg);

}
if(event & EPOLLERR)
{
e->handler(e->fd,e->arg);

}

}

}
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: