Libevent库基础(1)
1.创建 eevent_base
struct event_base *base = event_base_new();
2.创建 事件event
struct event *ev;
struct event *event_new(struct event_base *base,evutil_socket_t fd,short what,event_callback_fn cb; void *arg);
base: event_base_new()返回值。
fd:绑定到event上的文件描述符
what:对应的事件(r、w、e)
EV_READ 一次 读事件
EV_WRITE 一次 写事件
EV_PERSIST 持续触发。结合 event_base_dispatch 函数使用,生效。
cb:一旦事件满足监听条件,回调的函数。
typedef void (*event_callback_fn)(evutil_socket_t fd, short, void *)
arg:回调的函数的参数。
返回值:成功创建的event
3.添加事件到 event_base
int event_add(struct event *ev, const struct timeval *tv);
ev: event_new() 的返回值。
tv:NULL
从event_base上摘下事件 【了解】
int event_del(struct event *ev);
ev: event_new() 的返回值。
4.销毁事件
int event_free(struct event *ev);
ev: event_new() 的返回值。
操作管道代码:
read管道代码
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <string.h>
7 #include <fcntl.h>
8 #include <event2/event.h>
9
10 // 对操作处理函数
11 void read_cb(evutil_socket_t fd, short what, void *arg)
12 {
13 // 读管道
14 char buf[1024] = {0};
15
16 int len = read(fd, buf, sizeof(buf));
17
18 printf("read event: %s \n", what & EV_READ ? "Yes" : "No");
19 printf("data len = %d, buf = %s\n", len, buf);
20
21 sleep(1);
22 }
23
24
25 // 读管道
26 int main(int argc, const char* argv[])
27 {
28 unlink("myfifo");
29
30 //创建有名管道
31 mkfifo("myfifo", 0664);
32
33 // open file
34 //int fd = open("myfifo", O_RDONLY | O_NONBLOCK);
35 int fd = open("myfifo", O_RDONLY);
36 if(fd == -1)
37 {
38 perror("open error");
39 exit(1);
40 }
41
42 // 创建个event_base
43 struct event_base* base = NULL;
44 base = event_base_new();
45
46 // 创建事件
47 struct event* ev = NULL;
48 ev = event_new(base, fd, EV_READ | EV_PERSIST, read_cb, NULL);
49
50 // 添加事件
51 event_add(ev, NULL);
52
53 // 事件循环
54 event_base_dispatch(base); // while(1) { epoll();}
55
56 // 释放资源
57 event_free(ev);
58 event_base_free(base);
59 close(fd);
60
61 return 0;
62 }
write管道代码
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <string.h>
7 #include <fcntl.h>
8 #include <event2/event.h>
9
10 // 对操作处理函数
11 void write_cb(evutil_socket_t fd, short what, void *arg)
12 {
13 // write管道
14 char buf[1024] = {0};
15
16 static int num = 0;
17 sprintf(buf, "hello,world-%d\n", num++);
18 write(fd, buf, strlen(buf)+1);
19
20 sleep(1);
21 }
22
23
24 // 写管道
25 int main(int argc, const char* argv[])
26 {
27 // open file
28 //int fd = open("myfifo", O_WRONLY | O_NONBLOCK);
29 int fd = open("myfifo", O_WRONLY);
30 if(fd == -1)
31 {
32 perror("open error");
33 exit(1);
34 }
35
36 // 写管道
37 struct event_base* base = NULL;
38 base = event_base_new();
39
40 // 创建事件
41 struct event* ev = NULL;
42 // 检测的写缓冲区是否有空间写
43 //ev = event_new(base, fd, EV_WRITE , write_cb, NULL);
44 ev = event_new(base, fd, EV_WRITE | EV_PERSIST, write_cb, NULL);
45
46 // 添加事件
47 event_add(ev, NULL);
48
49 // 事件循环
50 event_base_dispatch(base);
51
52 // 释放资源
53 event_free(ev);
54 event_base_free(base);
55 close(fd);
56
57 return 0;
58 }
未决和非未决:
非未决: 没有资格被处理
未决: 有资格被处理,但尚未被处理
event_new --> event ---> 非未决 --> event_add --> 未决 --> dispatch() && 监听事件被触发 --> 激活态
--> 执行回调函数 --> 处理态 --> 非未决 event_add && EV_PERSIST --> 未决 --> event_del --> 非未决
Libevent库基础(1)的更多相关文章
- Libevent库基础(2)
带缓冲区的事件 bufferevent #include <event2/bufferevent.h> read/write 两个缓冲. 借助 队列. 创建.销毁bufferevent: ...
- Libevent库学习笔记
Libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,Libevent在底层select.pool.kqueue和epoll等机制基础上,封装出一致的事件接口.可 ...
- libevent库介绍--事件和数据缓冲
首先在学习libevent库的使用前,我们还要从基本的了解开始,已经熟悉了epoll以及reactor,然后从event_base学习,依次学习事件event.数据缓冲Bufferevent和数据封装 ...
- Windows平台下libevent库的使用
1 引子 手头上有一个使用了4个年头的HttpClient库,自己封装的,对于集成了IE浏览器的应用程序很友好.但最近想把产品扩展到Chrome和FireFox阵营,萌发了重构HttpClie ...
- C10K问题和Libevent库介绍
http://blog.chinaunix.net/uid-20761674-id-75056.html 一.C10K的问题 C10K的问题在上个世纪90年代就被提出来了.大概的意思是当用户数超过1万 ...
- R1:创建Libevent库
原文链接:http://www.wangafu.net/~nickm/libevent-book/Ref1_libsetup.html Setting up the Libevent library ...
- python linecache标准库基础学习
#python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...
- C 标准库基础 IO 操作总结
其实输入与输出对于不管什么系统的设计都是异常重要的,比如设计 C 接口函数,首先要设计好输入参数.输出参数和返回值,接下来才能开始设计具体的实现过程.C 语言标准库提供的接口功能很有限,不像 Pyth ...
- libevent库简单使用
一.libevent库简介 Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库.Libevent有几个显著的亮点: (1)事件驱动(event-dr ...
随机推荐
- Win10 搭建FTP环境,并使用Java实现上传,下载,删除
测试的环境一般都是在自己电脑上面装的,现在一般都使用Win10开发 搭建FTP: 第一步:打开控制面板:点击程序 第二步: 第三步: 然后点击确认后等待完成 完成后在启动中找到IIS管理器 打开 在网 ...
- 关于sqlmap当中tamper脚本编码绕过原理的一些总结(学习python没多久有些地方肯定理解有些小问题)
sqlmap中tamper脚本分析编写 置十对一些编码实现的脚本,很多sqlmap里面需要引用的无法实现,所以有一部分例如keywords就只写写了几个引用了一下,其实这里很多脚本运用是可以绕过安全狗 ...
- UCanCode发布升级E-Form++可视化源码组件库2020全新版 !
2020年. 中国.成都 UCanCode发布升级E-Form++可视化源码组件库2020全新版 ! --- 全面性能提升,UCanCode有史以来最强大的版本发布! E-Form++可视化源码组件库 ...
- 安装了高版本OS X 之后无法使用MacPorts的port命令
安装了高版本OS X 之后无法使用MacPorts的port命令 pod update提示: Current platform "darwin 14" does not match ...
- 最新版PyCharm激活教程!有效期至2089年!
Python的编译器有很多,像Pycharm.VsCode.Jupyter...哪个好用不做评价,各有各的优点!用过PyCharm的同学都知道,PyCharm有两大版本,专业版和社区版,专业版相当于社 ...
- JavaEE的核心API与组件
JAVAEE Java ee 平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对JAVAEE中的13种技术规范进行简单的描述( ...
- Spring AOP系列(一)— 代理模式
Spring AOP系列(一)- 代理模式 AOP(Aspect Oriented Programming)并没有创造或使用新的技术,其底层就是基于代理模式实现.因此我们先来学习一下代理模式. 基本概 ...
- ZooKeeper-3.5.6分布式锁
原理 基本方案是基于ZooKeeper的临时节点与和watch机制.当要获取锁时在某个目录下创建一个临时节点,创建成功则表示获取锁成功,创建失败则表示获取锁失败,此时watch该临时节点,当该临时节点 ...
- 为cmd中的命令添加别名,以解决java:错误: 编码 GBK 的不可映射字符 (0xAF)
使用sublineText3编写了java代码,通过cmd javac编译 提示 错误:编码GBK的不可映射字符 解决方法 使用javac -encoding UTF-8 Person.java 结果 ...
- Communicating to 2 SPI Slaves with USART & SPI ports on Atmega16U2
原文来自:https://www.avrfreaks.net/comment/2236256 I'm writing code for an embedded chip that consists o ...