libev学习系列之四:ev_loop事件循环

2023-11-12

libev学习系列之四:ev_loop事件循环


版本说明

版本 作者 日期 备注
0.1 ZY 2019.5.31 初稿

目录

一、前言

这个是基于官网资料以及这里

https://segmentfault.com/a/1190000006173864

基本上ev_loop你可以理解为一个大的循环,之前我们需要自己在线程里创建一个while循环,然后做一些多路复用监听等等,而这里的ev_loop你可以简单理解为就是代替这个循环的,当它开始之后,它会监听你设置的之前我们截图的watcher到这个loop中,该loop代替那个循环来监听你之前需要循环监听的事件,当该事件发生时,就会调用你在注册这个事件时绑定的回调函数。

二、描述

下面这个是官网的描述:

在这里插入图片描述

下面是参考网址中的内容:

event loop 用一个结构体struct ev_loop *描述。Libev 支持两类 loop,一是 default loop,支持 child process event;动态创建的 event loops 就不支持这个功能

struct ev_loop *ev_default_loop (unsigned int flags);

初始化 default loops。如果已经初始化了,那么直接返回并且忽略 flags。注意这个函数并不是线程安全的。只有这个 loop 可以处理ev_child事件。

struct ev_loop *ev_loop_new (unsigned int flags);

这个函数是线程安全的。一般而言,每个 thread 使用一个 loop。以下说明 flag 项的各个值:

  • EVFLAG_AUTO:默认值,常用
  • EVFLAG_NOENV:指定 libev 不使用LIBEV_FLAGS环境变量。常用于调试和测试
  • EVFLAG_FORKCHECK:与ev_loop_fork()相关
  • EVFLAG_NOINOTIFY:在ev_stat监听中不使用inotify API
  • EVFLAG_SIGNALFD:在ev_signal监听中使用signalfd API
  • EVFLAG_NOSIGMASK:使 libev 避免修改 signal mask。这样的话,你要使 signal 是非阻塞的。在未来的 libev 中,这个 mask 将会是默认值。
  • EVBACKEND_SELECT:通用后端
  • EVBACKEND_POLL:除了 Windows 之外的所有后端都可以用
  • EVBACKEND_EPOLL:Linux 后端
  • EVBACKEND_KQUEUE:大多数 BSD 的后端
  • EVBACKEND_DEVPOLL:Solaris 8 后端
  • EVBACKEND_PORT:Solaris 10 后端
void ev_loop_destroy (struct ev_loop *loop);

销毁ev_loop。注意这里要将所有的 IO 清除光之后再调用,因为这个函数并不中止所有活跃(active)的 IO。部分 IO 不会被清除,比如 signal。这些需要手动清除。这个函数一般和ev_loop_new一起出现在同一个线程中。

void ev_loop_fork (struct ev_loop *loop);

这个函数导致ev_run的子过程重设已有的 backend 的 kernel state。重用父进程创建的 loop。可以和pthread_atfork()配合使用。

对于上面flag值的选用其实就是我之前说要有一定socket、多路复用等基础知识的原因了,如果你不是很清楚的话,使用默认值即可。

三、例子

上面基本上已经说得很清晰了,你有child且要在子进程使用libev那你只能使用默认的loop,而如果你的进程需要在多线程中分别使用loop,那么最好在各个线程中创建各自的loop来保证线程安全。我一般使用子进程的情况较少,多是多线程方式使用,所以我一般的用法如下:

static void timeout_upload_cb(EV_P_ ev_timer *w_, int revents)
{
	...
}

static void *thread_device_info_upload()
{
	g_loop = ev_loop_new(EVFLAG_AUTO);
	
    ev_timer_init(&g_timer_watcher, timeout_upload_cb, TIMEOUT, TEST_REPEAT_TIME);

	ev_timer_start(g_loop, &g_timer_watcher);

	ev_run(g_loop, 0);

	return NULL;
}

其中g_loop就是我在该线程下创建的loop:static struct ev_loop *g_loop = NULL;

为了保证退出时调用ev_break(g_loop, EVBREAK_ALL); 所以一般是将loop设为全局变量。

当然,你也可以像

https://www.cnblogs.com/wunaozai/p/3950249.html

里面的例子这样来使用:

#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/unistd.h>
#include <ev.h>


void io_action(struct ev_loop *main_loop,ev_io *io_w,int e)
{
    int rst;
    char buf[1024];
    memset(buf,0,sizeof(buf));
    puts("In IO action");
    read(STDIN_FILENO,buf,sizeof(buf));
    buf[1023]='\0';
    printf("String: %s\n",buf);
    ev_io_stop(main_loop,io_w);
}

void timer_action(struct ev_loop *main_loop,ev_timer *time_w,int e)
{
    puts("In Time action");
    ev_timer_stop(main_loop,time_w);
}

void signal_action(struct ev_loop *main_loop,ev_signal *signal_w,int e)
{
    puts("In Signal action");
    ev_signal_stop(main_loop,signal_w);
    ev_break(main_loop,EVBREAK_ALL);
}

int main(int argc,char **argv)
{
    ev_io io_w;
    ev_timer timer_w;
    ev_signal signal_w;
    struct ev_loop *main_loop = ev_default_loop(0);

    ev_init(&io_w,io_action);
    ev_io_set(&io_w,STDIN_FILENO,EV_READ);

    ev_init(&timer_w,timer_action);
    ev_timer_set(&timer_w,2,0);

    ev_init(&signal_w,signal_action);
    ev_signal_set(&signal_w,SIGINT);

    ev_io_start(main_loop,&io_w);
    ev_timer_start(main_loop,&timer_w);
    ev_signal_start(main_loop,&signal_w);

    ev_run(main_loop,0);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libev学习系列之四:ev_loop事件循环 的相关文章

  • TCP中的Nagle算法

    一 Nagel算法 TCP IP协议中 无论发送多少数据 总是要在数据前面加上协议头 同时 对方接受到数据 也需要发送ack表示确认 为了尽可能利用网络带宽 TCP总是希望尽可能发送足够大的数据 在一个连接中会设置MSS参数 因此 TCP
  • windows网络编程-结构体说明

    1 sockaddr in struct sockaddr in short sin family u short sin port 端口 struct in addr sin addr IP地址 long类型 4字节 char sin z
  • 嵌入式编写TCP连接过程

    先来一个三次握手和四次挥手 嵌入式连接过程 1 af 为地址族 Address Family 也就是 IP 地址类型 常用的有 AF INET 和 AF INET6 AF 是 Address Family 的简写 INET是 Inetnet
  • NIO效率高的原理之零拷贝与直接内存映射

    前言 在笔者上一篇博客 详解了NIO 并总结NIO相比BIO的效率要高的三个原因 点击查看 这篇博客将针对第三个原因 进行更详细的讲解 首先澄清 零拷贝与内存直接映射并不是Java中独有的概念 并且这两个技术并不是等价的 零拷贝 零拷贝是指
  • getaddrinfo简单应用——取得IP地址

    转自 http biancheng dnbcw info linux 265956 html 一个域名可能对应好几个ip地址 a out www baidu com 115 239 210 27 115 239 211 112 getadd
  • 网络分层模型

    OSI七层模型 物数网传会表应 物理层 主要定义物理设备标准 如网线的接口类型 光纤的接口类型 各种传输介质的传输速率等 它的主要作用是传输比特流 就是由1 0转化为电流强弱来进行传输 到达目的地后再转化为1 0 也就是我们常说的数模转换与
  • 回调函数

    单线程的时候同步的话 很容易阻塞在那边 用户体验极差 例如 异步是可以多线程的 因为UI主线程一旦阻塞整个界面就卡死了 一旦异步 两个线程下一个可以后台处理数据 一个可以做UI显示 js是单线程的 如果所有的操作 ajax 获取文件等I O
  • 基于Linux用C语言实现TCP/UDP图片和文件传输(socket)

    目录 一 TCP实现 1 服务端 2 客户端 二 UDP实现 1 服务端 2 客户端 一 TCP实现 传输控制协议 TCP Transmission Control Protocol 是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设
  • Unity使用C#实现简单Scoket连接及服务端与客户端通讯

    简介 网络编程是个很有意思的事情 偶然翻出来很久之前刚开始看Socket的时候写的一个实例 贴出来吧 Unity中实现简单的Socket连接 c 中提供了丰富的API 直接上代码 服务端代码 Thread connectThread 当前服
  • 基于TCP的服务器端/客户端

    TCP服务器端默认函数调用顺序 socket 创建socket bind 分配socket地址 listen 等待连接请求状态 accept 允许连接 read write 数据交换 close 断开连接 等待连接请求状态 int list
  • 进程间通信之共享内存分析

    零拷贝技术 https strikefreedom top linux io and zero copy 一 内存映射和共享内存的区别 1 1 内存映射之mmap函数 将一个文件或者其它对象映射到进程的地址空间 实现文件磁盘地址和进程虚拟地
  • Linux实现多进程服务端Socket通信

    目录 程序流程 程序实例 运行结果 本例主要是让服务器能够同时处理多个客户端的连接请求 程序流程 1 创建基本的套接字 并绑定地址信息 设置监听 2 循环accept来接收连接请求 每接收一个连接请求 就创建一个子进程 3 在子进程中进行客
  • Muduo库源码剖析(十)——总结

    Muduo网络库的核心代码模块 Channel 封装fd的对应事件变化情况 和关注事件 fd events revents callbacks 两种channel listenfd acceptorChannel connfd connec
  • 程序猿眼中的协议:TCP / IP 五层网络模型

    哈喽 大家好 我是你们的老朋友 保护小周 本期为大家带来的是 网络基础原理中的 TCP IP 五层网络模型 主要从协议的概念 网络模型 数据分层传输的流程 几个方面讲解 看完之后可以轻松的理解数据是如何在网络中传输的 确定不来看看嘛 更多精
  • 网络编程——软件架构、osi七层、TCP/UDP协议

    文章目录 一 网络编程是什么 二 软件架构 1 c s架构 2 b s架构 三 OSI七层 1 物理层 2 链路层 3 网络层 4 传输层 5 应用层 四 TCP UDP协议 1 TCP 2 UDP协议 一 网络编程是什么 一个完整计算机系
  • 并发编程概览

    由于内容较多 将会分成多篇文章详述 可移步查看 操作系统发展史 多道技术 进程理论 进程的并行与并发 进程的三状态 同步与异步 阻塞与非阻塞 同步异步与阻塞非阻塞 创建进程的多种方式 join方法 进程间数据默认隔离 进程间通信IPC机制
  • Node.js开发入门—HTTP文件服务器

    HelloWorld示例只有演示意义 这次我们来搞一个实际的例子 文件服务器 我们使用Node js创建一个HTTP协议的文件服务器 你可以使用浏览器或其它下载工具到文件服务器上下载文件 用Node js实现的HTTP文件服务器 比我在Qt
  • fork()函数详解

    一个进程 包括代码 数据和分配给进程的资源 fork 函数通过系统调用创建一个与原来进程几乎完全相同的进程 也就是两个进程可以做完全相同的事 但如果初始参数或者传入的变量不同 两个进程也可以做不同的事 一个进程调用fork 函数后 系统先给
  • HTTPS 的加密流程

    目录 一 HTTPS是什么 二 为什么要加密 三 加密 是什么 四 HTTPS 的工作过程 1 对称加密 2 非对称加密 3 中间人攻击 4 证书 总结 一 HTTPS是什么 HTTPS Hyper Text Transfer Protoc
  • libuv 只是 POSIX 系统上 libev 的包装吗?

    我真的很困惑 libev 和 libuv libuv 只是 POSIX 系统上 libev 的包装吗 如果不是的话区别在哪里 不再 从 libuv v0 9 开始 这是libuv github问题 https github com joye

随机推荐

  • Outlook 突然打不开

    打开电脑正准备上班然后outlook崩了 报错建议我重装软件 问题是现在用的都是365全家桶 也没办法单独重装一个outlook 盲试了一把repair居然修好了 再后来就经常用到它T T 不是什么好事 首先有几种临时解决方法 如果时间很紧
  • mysql配置超详细教程_MySQL系列(一):超详细、非常适合入门的MySQL安装、环境配置教程...

    MySQL系列教程不定期更新 欢迎关注 一 安装环境 Windows 10 专业版 64位 二 下载MySQL 1 访问MySQL官网 网址为 http www mysql com 2 点击页面上方的 DOWMLOADS 3 选择 MySQ
  • 苹果全新iPhone首发3nm自研芯片,结果“华为发布会”冲上热搜第一…

    明敏 丰色 西风 发自 凹非寺量子位 公众号 QbitAI 就离谱 苹果发iPhone 15 结果发着发着 华为发布会 冲上了热搜第一 哪怕是iPhone 15全系告别11年闪电接口改用USB C 经典静音键从Pro系列消失 这些库克 违背
  • Android性能优化—内存优化

    一 App内存组成以及管理 Android 给每个 App 分配一个 VM 让App运行在 dalvik 上 这样即使 App 崩溃也不会影响到系统 系统给 VM 分配了一定的内存大小 App 可以申请使用的内存大小不能超过此硬性逻辑限制
  • 机器学习中关于偏差、方差和误差的理解

    在模型预测中 模型可能出现的误差来自两个主要来源 1 因模型无法表示基本数据的复杂度而造成的偏差 bias 2 因模型对训练它所用的有限数据过度敏感而造成的方差 variance 误差是测量值与真实值之间的差值 用误差衡量测量结果的准确度
  • Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the 'MySQL' driver (jar file)

    org pentaho di core exception KettleDatabaseException Error occurred while trying to connect to the database Driver clas
  • [培训-无线通信基础-6]:信道编码(分组码、卷积吗、Polar码、LDPC码、Turbo码)

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 118657107 目录 前言
  • Shell计算时间运行时间

    方法1 starttime date Y m d H M S 执行程序 endtime date Y m d H M S start seconds date date starttime s end seconds date date e
  • 笔试

    文章目录 前言 21 FPGA组成三要素 1 CLB 2 可编程内部互联资源 3 可编程输入输出块 22 查找表 LUT 23 锁存器 latch 触发器 24 亚稳态 25 逻辑电平 26 逻辑最小项 总结 往期精彩 前言 本文首发于微信
  • LeetCode-135.分发糖果、贪心算法

    老师想给孩子们分发糖果 有 N 个孩子站成了一条直线 老师会根据每个孩子的表现 预先给他们评分 你需要按照以下要求 帮助老师给这些孩子分发糖果 每个孩子至少分配到 1 个糖果 相邻的孩子中 评分高的孩子必须获得更多的糖果 那么这样下来 老师
  • 【共享内存】

    1 共享内存示意图 共享内存区是最快的 IPC 形式 一旦这样的内存映射到共享它的进程的地址空间 这些进程间数据传递不再涉及到 内核 换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据 2 共享内存数据结构 struct shmi
  • uniapp 框架引用turf.js步骤

    Turf js中文网 一 安装指定模块 示例 实现运动轨迹缓冲区及迹缓冲面积计算 接口获取的轨迹点连成线 Turf js 轨迹点只有一个则无法连成线 a npm 安装 npm install turf helpers b 页面引入 impo
  • 深入LDO学习

    目录 工程问题 1 LDO 输出电源电平低于设置值 2 电源芯片欠压保护电路导 致上电时序不满足设计的要求 原理 layout图 优点 缺点 原理 选型 热计算 计算 LDO 工作时的结温 工程问题 1 LDO 输出电源电平低于设置值 某款
  • jqueryweui,两个输入框解决方法

    document ready function
  • CURL使用SSL证书访问HTTPS

    在支付的交互过程中 安全绝对是需要考虑的重要因素之一 体现在对服务器交互数据的签名等环节 但有的时候为了能达到更高的安全级别 还需要用ssl证书 即web服务器有证书 浏览器客户端 请求端也需要安装证书来达到双向验证 比如请求下面的财付通支
  • Linux:169.254.0.0/24路由的来龙去脉

    在Linux中 发现每次系统启动时 都会将 169 254 0 0 16 路由启动并将其添加到路由表中 但是并不知道这条路由具有什么功能和它到底来自于哪里 要想搞清楚路由 169 254 0 0 16 究竟来自哪里并且它的作用是什么 首先需
  • Contest3032 - 计科2101~2104算法设计与分析上机作业03

    目录 问题 A 质数 问题 B 分治法求解全排列问题 问题 C 数的计数 问题 D 最大公共子序列问题 问题 E 分解式的个数 问题 F 矩阵最优连乘问题 问题 A 质数 题目描述 判断给定的一组正整数是否为质数 输入 第一行为测试数据的个
  • linux创建新用户

    只需要四步就能创建一个新的linux用户 1 打开终端 快捷键Ctrl Alt T 2 创建用户和密码 sudo useradd m aaa 创建用户名为aaa的用户 m 自动建立用户的登入目录 sudo是允许系统管理员让普通用户执行roo
  • 在地址栏里输入一个地址回车会发生哪些事情

    解析URL 首先会对 URL 进行解析 分析所需要使用的传输协议和请求的资源的路径 如果输入的 URL 中的协议或者主机名不合法 将会把地址栏中输入的内容传递给搜索引擎 如果没有问题 浏览器会检查 URL 中是否出现了非法字符 如果存在非法
  • libev学习系列之四:ev_loop事件循环

    libev学习系列之四 ev loop事件循环 版本说明 版本 作者 日期 备注 0 1 ZY 2019 5 31 初稿 目录 文章目录 libev学习系列之四 ev loop事件循环 版本说明 目录 一 前言 二 描述 三 例子 一 前言