精通epoll架构

  epollLinux中最优秀的多路复用机制!

与select 、poll区别

1.select和poll没有太大区别,除了select有文件描述符限制(1024个)。select每次调用都需要将fd集合拷贝到内核态,且监听过程遍历所有的文件位置,开销很大。

2.Epoll监测无上限,在注册新事件时就会一次性把所有fd拷贝到内核,无序遍历即可查询到监听位置,提高效率。

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

多路复用:一个进程同时监控多个文件或设备;

阻塞IO   :进程执行过程中,无命令处理时进程休眠,有命令待处理时,唤醒进程处理命令;(避免在无命令时进程忙等占用CPU,高效)

  epoll支持管道FIFO、套接字socket、POSIX消息队列、终端等,但不支持普通文件。epoll分成如下三个环节:

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

epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event)

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

等待监听事件发生 n = epoll_wait(epfd, events, 100, -1)     返回事件发生个数
int main()
{
int fd1,fd2,efd;
struct epoll_event event;
struct epoll_event *events;
// 创建FIFO
mkfifo("/tmp/fifo1",); //要创建的FIFO文件的名字(含路径)
mkfifo("/tmp/fifo2",);
fd1=open("/tmp/fifo1",O_RDONLY); //打开管道文件监听
fd2=open("/tmp/fifo2",O_RDONLY); //1. 创建监听池
efd = epoll_create1(0);
//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,100,-1);
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);
}
}
free(events); close(fd1); close(fd2);//关闭打开的文件+释放申请的堆内存
}

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

----------------------------------------------------------------------------------------------------------

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

  创建基本的监听架构,将摄像头采集端作为监听事件,添加至监听池,当监听到摄像头捕捉到图像文件时,即自动触发启动对应的处理函数,将获取到图片数据发送至显示子系统,添加移植至GTK程序即可实现视频采集播放。

3-1. 基于epoll架构的视频采集端设计的更多相关文章

  1. 基于视频压缩的实时监控系统-sprint1基于epoll架构的采集端程序设计

    part1:产品功能 part2:epoll机制   select与epoll区别 1.select与epoll没有太大的区别.除了select有文件描述符限制(1024个),select每次调用都需 ...

  2. 基于PCIe的多路视频采集与显示子系统

    基于PCIe的多路视频采集与显示子系统 1        概述 视频采集与显示子系统可以实时采集多路视频信号,并存储到视频采集队列中,借助高效的硬实时视频帧出入队列管理和PCIe C2H DMA引擎, ...

  3. 基于.NET架构的树形动态报表设计与应用

    在一些统计报表中,利用树形结构报表来实现维度钻取功能是十分常见的.通过逐级钻取,可以快速查看更细粒度的指标数据,如项目施工进度报告等. 使用葡萄城报表控件——ActiveReports ,即可轻松设计 ...

  4. 基于Hi3559AV100的视频采集(VDEC-VPSS-VO)整体框图设计

    下面给出基于Hi3559AV100的视频采集整体设计,具体设计将在后续给出: 图形采集端整体设计 Hi3559AV100软件程序按结构划分可分为4层,第一层是硬件驱动层,第二层是操作系统层,第三层是媒 ...

  5. 基于H5的摄像头视频数据流采集

    最近,为了支持部门团队的项目,通过H5实现摄像头的视频流数据的捕获,抓取到视频流后,传输到视频识别服务器进行后续的逻辑处理. 视频数据的采集过程,其实是比较没有谱的过程,因为之前没有研究过HTML5操 ...

  6. 基于Linux的v4l2视频架构驱动编写(转载)

    转自:http://www.linuxidc.com/Linux/2011-03/33022.htm 其实,我刚开始一直都不知道怎么写驱动,什么都不懂的,只知道我需要在做项目的过程中学习,所以,我就自 ...

  7. 基于Linux的v4l2视频架构驱动编写

    其实,我刚开始一直都不知道怎么写驱动,什么都不懂的,只知道我需要在做项目的过程中学习,所以,我就自己找了一个关于编写Linux下的视频采集监控项目做,然后上学期刚开学的时候听师兄说,跟院长做项目,没做 ...

  8. 轻松构建基于 Serverless 架构的弹性高可用音视频处理系统

    前言 随着计算机技术和 Internet 的日新月异,视频点播技术因其良好的人机交互性和流媒体传输技术倍受教育.娱乐等行业青睐,而在当前, 云计算平台厂商的产品线不断成熟完善, 如果想要搭建视频点播类 ...

  9. 基于FPGA的LCD+CMOS视频采集显示使用小结

    基于FPGA的LCD+CMOS视频采集显示 液晶显示器采用扫描模式,RGB888 电源采用:+5V供电 usb供电有时候会出现供电不足的问题 显示器接口有两种选择:16bit或24bit  分别对应 ...

随机推荐

  1. SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

    一.背景:SpringCloud 生态圈 在正式开始本篇文章之前我们先岔开来讲一下SpringCloud的生态圈. SpringCloud大家都比较熟悉了,它制定了分布式系统的标准规范,做了高度抽象和 ...

  2. 深入学习JAVA注解-Annotation(学习过程)

    JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...

  3. swoole websocket_server 聊天室--群聊

    centos7  php7.2 swoole4.3 nginx1.8 websocket_server 代码 <?php $server = new Swoole\WebSocket\Serve ...

  4. office一直提示配置进度与图标问题

    原来安装了wps office,广告太烦,于是卸载了wps安装Microsoft office 2010,安装完成后每次打开excel文件都要重新安装配置,修改注册表norereg和设置兼容模式都不行 ...

  5. 关于QThread使用锁死的探索

    在学习使用QT5的时候,发现要使用多线程处理多任务,按照https://www.cnblogs.com/liming19680104/p/10397052.html等很多网上的方法,测试一下,发现我写 ...

  6. C++ 按行读取文件并打印

    #include<iostream> #include<fstream> #include<string> #include <vector> #inc ...

  7. python3.4.3 连接Oracle生成报表并发送邮件

    python很简单,又很实用.当有需求时用起来会更有方向,大可不必从语法.循环等基础看起. 由于工作需要,每天要拉一份报表发给业务的同事,先是用SSIS做了个包部署到服务器上,每天定时拉报表发邮件给同 ...

  8. 《Java8 Stream编码实战》正式推出

    ​当我第一次在项目代码中看到Stream流的时候,心里不由得骂了一句"傻X"炫什么技.当我开始尝试在代码中使用Stream时,不由得感叹真香. 记得以前有朋友聊天说,他在代码中用了 ...

  9. [Linux][C][gcc] Linux GCC 编译链接 报错ex: ./libxxx.so: undefined reference to `shm_open'

    本人原创文章,文章是在此代码github/note的基础上进行补充,转载请注明出处:https://github.com/dramalife/note. 以librt丶用户自定义动态库libxxx 和 ...

  10. C++类复习及新的认识 6.1.1+6.1.2内容(适合看过一遍书的新手)

    作者水平有限,文字表述大多摘抄课本,源码部分由课本加自己改编而成,所有代码均在vs2019中编译通过 定义类操作 class Tdate { public: void Set(int m, int d ...