part1:产品功能

part2:epoll机制

    select与epoll区别

  1、select与epoll没有太大的区别。除了select有文件描述符限制(1024个),select每次调用都需要将

fd集合拷贝到内核,且监听过程遍历所有的文件位置,开销很大。

  2、epoll监测无上限,在注册新事件是就会一次性把所有fd拷贝到内核,无需遍历即可查询到监听的位

置,提高监听效率。

  (epoll是Linux中最优秀的多路复用机制)

  epoll的优势:1、多路复用;2、阻塞IO;3、无需遍历所有文件即可知道错误的文件位置(高效)

        4、监控文件无上限

  epoll支持管道、FIFO、套接字、POSIX 消息队列、终端等,但不支持普通文件(文本文件,可执行性文件)

创建epoll监听池 epfd = epoll_create(50)           返回epfd指向创建的监听池 
添加epoll监听事件

epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event)

监听池epfd  操作符  要监听文件的fd  监听结构类型

等待监听事件发生 n = epoll_wait(epfd, events, 100, -1)     返回事件发生个数

eg:使用epoll监听两个管道的通信

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/epoll.h> int main()
{
int fd1, fd2;
int efd;
int i,n;
char c;
struct epoll_event event;
struct epoll_event* events; //创建管道FIFO
mkfifo("/tmp/fifo1", );
mkfifo("/tmp/fifo2", ); fd1 = open("/tmp/fifo1", O_RDONLY);
fd2 = open("/tmp/fifo2", O_RDONLY); //1、创建epoll监听池
efd=epoll_create1();
//2、构建监听事件,加入监听池
event.events = EPOLLIN | EPOLLET; //可读 边沿触发
event.data.fd = fd1; //关注的文件
epoll_ctl(efd, EPOLL_CTL_ADD, fd1, &event); event.events = EPOLLIN | EPOLLET; //可读 边沿触发
event.data.fd = fd2; //关注的文件
epoll_ctl(efd, EPOLL_CTL_ADD, fd2, &event); //3、等待事件的发生,监听
events = calloc(, sizeof event); //保存事件数组
n = epoll_wait(efd, events, , -);
for (i = ; i < n; i++)
{
if (events[i].events & EPOLLIN)
{
//处理
read(events[i].data.fd, &c, );
printf("file %d can be read\n", events[i].data.fd);
}
if (events[i].events & EPOLLOUT)
{/*处理*/}
if (events[i].events & EPOLLERR)
{/*处理*/}
}
free(events);close(fd1);close(fd2); //关闭打开的文件+释放申请的堆内存 }
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h> int main()
{
int fd;
char c = 'c';
fd = open("/tmp/fifo1", O_WRONLY);
write(fd, &c, );
close(fd);
return ;
} #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/epoll.h> int main()
{
int fd;
char c = 'c';
fd = open("/tmp/fifo2", O_WRONLY);
write(fd, &c, );
close(fd);
return ;
}

检测:分别编写程序向两个管道文件内写入数据,编译运行后epoll立即检测到事件发生

part3:基于epoll采集端程序设计

epoll架构加入摄像头采集端,监听摄像头是否采集到数据(事件)

int main()
{
struct wcamsrv* ws;
ws = calloc(, sizeof(struct wcamsrv));
//1、创建epoll
ws->app = app_poll_create(); //2、加入事件
ws->cfg = cfg_init(); //配置子子函数
ws->cap = cap_init(); //捕获(采集)
ws->tran = transfer_init();//传输子系统 //3、等待事件
return app_exec(ws->app);
void app_add_event(app_poll_t app, app_event_t app_e)
{ //事件监听模式选择
int op;
struct epoll_event event;
event.data.ptr = app_e;
event.events = app_e->events; if (app_e->epolled)
{
op = EPOLL_CTL_MOD;//修改
}
else
{
op = EPOLL_CTL_ADD;//增加
app_e->epolled = true;
} epoll_ctl(app->epfd, op, app_e->fd, &event);
}
app_poll_t app_poll_create(int event_max)
{ //初始化函数
app_poll_t app;
app = calloc(, sizeof(struct app_poll));
if (event_max > )
app->event_max = event_max;
else
app->event_max = DEF_MAX;
app->epfd = epoll_create(app->event_max); if (app->epfd < )
{
perror("epoll create");
goto err_mem;
}
return app;
err_mem:
free(app);
return NULL;
}
void app_exec(app_poll_t app)
{
int i;
int fds;
int event;
app_event_t app_e; struct epoll_event events[app->event_max];//事件数组 while ()
{
fds = epoll_wait(app->epfd, events, app->event_max, );
for (i = ; i < fds; i++)
{
app_e = (app_event_t)events[i].data.ptr;
event = events[i].events;
if (event & EPOLLIN)
app_e->handler_rd(app_e->fd, app_e->arg_rd);//处理
if (event & EPOLLOUT)
app_e->handler_wr(app_e->fd, app_e->arg_wr);//处理
if (event & EPOLLERR)
app_e->handler_er(app_e->fd, app_e->arg_er);
}
}
}
void app_event_add_handler(app_event_t app_e, enum app_op type, void (*handler)(int, void*), void* arg)
{ //事件处理函数
switch (type)
{
case NOTIFIER_READ:{
app_e->events = EPOLLIN;
app_e->handler_rd = handler;
app_e->arg_rd = arg;
break;}
case NOTIFIER_WRITE:{
app_e->events = EPOLLOUT;
app_e->handler_rd = handler;
app_e->arg_rd = arg;
break;}
case NOTIFIER_ERROR:{
app_e->events = EPOLLERR;
app_e->handler_rd = handler;
app_e->arg_rd = arg;
break;}
}
}

基于视频压缩的实时监控系统-sprint1基于epoll架构的采集端程序设计的更多相关文章

  1. 阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint1-基于Epoll架构的采集端程序框架设计\第2课-基于Epoll的采集端程序框架设计

    回顾之前的整个程序架构 把epoll机制应用到这个架构上去 下面主要去分析我们的系统中有没有需要等待的事件,先看看采集子系统 在采集子系统当中,摄像头有数据,摄像头采集到图像数据可以作为一个等待事件. ...

  2. 项目-基于视频压缩的实时监控系统--tiny6410

    项目-基于视频压缩的实时监控系统--tiny6410 @国嵌linux学习笔记. 1. 构造服务端结构体 server struct server { int epfd; //保存epoll指针 st ...

  3. 基于视频压缩的实时监控系统-sprint2采集端图像采集子系统设计

    (1).初始化:a.初始化摄像头:b.注册事件到epoll (2).开始采集--->触发事件处理系统 (3).保存图像(方便测试) a.初始化摄像头 //初始化摄像头 1.获取驱动信息 2.设置 ...

  4. \阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint2-采集端图像采集子系统设计

    1.在编写程序前有一个流程,思维导图: 初始化:包括初始化摄像头:注册事件到epoll 然后是开始启动采集:一旦开始采集我们的摄像头就会有数据了,它会触发事件处理函数:我们在这里的处理是保存这个图像: ...

  5. 基于视频压缩的实时监控系统-sprint3采集端传输子系统设计

    由于jpg本来就是编码压缩后的格式,所有无需重复编码 传输子系统步骤:(1)初始化:a.socket(初始化tcp连接):b.将事件添加到epoll中 (2)事件处理:接收到网络包.发送完网络包 st ...

  6. [经验交流] 试用基于 influxdb+kapacitor 的监控系统

    2017年10月16日: 使用中发现kapacitor的ui过于简单,不能满足实际工作需要,现已切换到grafana --------- 两个月前试用了基于 elasticsearch + xpack ...

  7. 嵌入式应用开发第四阶段-基于rk3399的视频监控系统

    一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...

  8. lite-monitor 一款基于shell命令的监控系统

    介绍 lite-monitor 一款基于shell命令的监控系统,可以根据项目中输出的日志定时输出或者统计输出,并发送钉钉机器人报警消息. lite-monitor能做什么: 定时监控某个服务进程是否 ...

  9. 手把手搭建一套基于 Sentry 的异常监控系统

    手把手搭建一套基于 Sentry 的异常监控系统 Sentry 开源版 DevOps refs https://github.com/getsentry/sentry sentry-anomaly-m ...

随机推荐

  1. day19 生成器+函数递归

    目录 一.yield表达式 1 yield表达式基本用法 二.三元表达式 三.生成式 1 列表生成式 2 字典生成式 3 集合生成式 4 生成器表达式 四.函数的递归 1 递归的定义 2 详解递归 前 ...

  2. redis源码学习之工作流程初探

    目录 背景 环境准备 下载redis源码 下载Visual Studio Visual Studio打开redis源码 启动过程分析 调用关系图 事件循环分析 工作模型 代码分析 动画演示 网络模块 ...

  3. Scala 基础(十五):Scala 模式匹配(三)

    1 变量声明中的模式 match中每一个case都可以单独提取出来,意思是一样的. 应用案例 val (x, y) = (1, 2) val (q, r) = BigInt(10) /% 3 //说明 ...

  4. 数据可视化之powerBI入门(八)PowerQuery学习:认识M函数

    https://zhuanlan.zhihu.com/p/64148928 前面我们学习PQ的时候都是用鼠标操作,虽然通过这些操作能完成大部分的数据处理,但是毕竟还有些复杂的工作是处理不了的,如果想彻 ...

  5. Python之爬虫(十七) Scrapy框架中Spiders用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...

  6. Django之 Models组件

    本节内容 路由系统 models模型 admin views视图 template模板 引子 讲django的models之前, 先来想一想, 让你通过django操作数据库,你怎么做? 做苦思冥想, ...

  7. 数据结构中有关顺序表的问题:为何判断插入位置是否合法时if语句中用length+1,而移动元素的for语句中只用length?

    bool ListInsert(SqList &L,int i, ElemType e){ if(i<||i>L.length+) //判断i的范围是否有效 return fals ...

  8. 理解Spring(一):Spring 与 IoC

    目录 什么是 Spring Spring 的整体架构 什么是 IoC Bean 的概念 Spring 的基本使用 Spring 的两种 IoC 容器 Spring 容器的基本工作原理 Spring B ...

  9. Apache 阿帕奇 配置运行环境

    阿帕奇 Apache 是一个很常用的服务器环境. 安装阿帕奇后,需要对配置文件进行修改,才能使用. https.conf是阿帕奇的配置文件,地址在 阿帕奇的安装目录\conf\httpd.conf 默 ...

  10. vue : watch、computed、以及对象数组

    watch和computed是vue框架中很重要的特性. 那么,他们是怎么作用于对象数组的? 今天我们就来探究一下. 上代码. <template> <div class=" ...