精通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. 使用增量备份修复DG中的GAP

    问题描述 oracle中DG出现主备不同步现象,alert日志报警有gap信息,但是v$archive_gap视图查不到任何信息.同时主库上的对应归档已经删除且没有备份 解决方案 1.查询备库的scn ...

  2. LinkedHashMap源码解读

    1. 前言 还是从面试中来,到面试中去.面试官在面试 Redis 的时候经常会问到,Redis 的 LRU 是如何实现的?如果让你实现 LRU 算法,你会怎么实现呢?除了用现有的结构 LinkedHa ...

  3. ASP.net MVC 构建layui管理后台(整体效果)

    登录页: 首页 模块管理 角色管理,角色分配 用户管理

  4. Spyder——科学的Python开发环境

    刚开始接触Python的时候,网上找到的资料基本上上来就是介绍Python语言,很少有对开发环境进行讲解的,但如果在学习的过程中不断练习,这样效率会更高,所以特意将一个Python的开发环境Spyde ...

  5. 【vue生命周期】- 详解

    这篇文章通俗易懂,写的不错,本文转载至:https://www.cnblogs.com/happ0/p/8075562.html 详解Vue Lifecycle 先来看看vue官网对vue生命周期的介 ...

  6. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...

  7. 2018 巅峰极客CTF misc writeup

    flows 拿到一个pcap包,用wireshark打开,发现是USB协议,尝试在kali下使用tshark提取,提取失败,发现异常.回到wireshark分析数据.在其中一个数据包中发现了tip 把 ...

  8. LeetCode#232-Implement Queue using Stacks-用栈实现队列

    一.题目 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列 ...

  9. [组件封装]微信小程序-日历

    描述 切换月份, 当天文案为今天, 日期背景变色, 日期红点标识, 点击选中日期. 效果 源码 calendar.wxml <view class="component"&g ...

  10. 解决tinyint映射成boolean/byte的问题

    前言 最近受疫情的影响,公司要做一个类似一码通的系统为客户服务.由我来进行表的设计.创建表之后需要逆向生成Java的entity.mapper.mapper.xml.由于我在数据库中定义了大量 tin ...