libevent入门教程:简单示例

信号

使用libevent捕获系统信号。

函数调用流程图为

flowchart TB

A(Start) --> B[event_init]
B --> C[event_new]
C --> D[event_add]
D --> E[event_base_dispatch]
E --> F[event_free]
F --> G(End)

对应代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>
#include<event.h>
#include<assert.h>

void signal_cb(int fd,short event,void* arg)
{
if(event & EV_SIGNAL)
{
//fd与事件类型 系统传入,其他参数在arg
printf("sig = %d\n",fd);
}
}

int main()
{
//实例初始化
struct event_base* base = event_init();
assert(base != NULL);

struct event* sig_ev = event_new(base,SIGINT,EV_SIGNAL|EV_PERSIST,signal_cb,NULL);
assert(sig_ev != NULL);
event_add(sig_ev,NULL);

//启动事件循环
event_base_dispatch(base);
//阻塞在这里 内部进行循环 并且libevent会根据情况去选择使用select,poll,或eopll

//释放事件与实例
event_free(sig_ev);
event_base_free(base);
}
  • event_new定义信号事件,参数指定了哪个实例、信号是谁、如何处理信号,信号处理回调函数,回调函数传入参数
  • event_add事件注册,参数指定了添加事件、事件超时事件

编译命令

1
gcc signal.c -o signal -levent

运行程序,使用Ctrl+C结束程序

1
2
3
4
5
6
7
8
9
10
11
12
hyper@hyper-wayland:~/Documents$ ./signal
^Csig = 2
^Csig = 2
^Csig = 2
^Csig = 2
^Csig = 2
^Csig = 2
^Csig = 2
^Csig = 2
^Csig = 2
^Csig = 2
^Csig = 2

一直捕获到结束信号。

定时器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>
#include<event.h>
#include<assert.h>

void timeout_cb(int fd,short event,void* arg)
{
if(event & EV_TIMEOUT)
{
printf("Time out\n");
}
}

int main()
{
//实例初始化
struct event_base* base = event_init();
assert(base != NULL);

//定义定时事件
struct event* timeout_ev = event_new(base,-1,EV_TIMEOUT,timeout_cb,NULL);
struct timeval tv = {3,0};//指3秒0微秒
event_add(timeout_ev,&tv);

//启动事件循环
event_base_dispatch(base);
//阻塞在这里 内部进行循环 并且libevent会根据情况去选择使用select,poll,或eopll

//释放事件与实例
event_free(timeout_ev);
event_base_free(base);
}

编译运行输出为

1
2
3
hyper@hyper-wayland:~/Documents$ ./timer
Time out
hyper@hyper-wayland:~/Documents$

系统信号在程序运行时捕获,定时器只捕获一次。

源码

信号和定时器代码可以整合一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>
#include<event.h>
#include<assert.h>


void signal_cb(int fd,short event,void* arg)
{
if(event & EV_SIGNAL)
{
//fd与事件类型 系统传入,其他参数在arg
printf("sig = %d\n",fd);
}
}
void timeout_cb(int fd,short event,void* arg)
{
if(event & EV_TIMEOUT)
{
printf("Time out\n");
}
}

int main()
{
//实例初始化
struct event_base* base = event_init();
assert(base != NULL);

//struct event* sig_ev = evsignal_new(base,SIGINT,signal_cb,NULL);
struct event* sig_ev = event_new(base,SIGINT,EV_SIGNAL|EV_PERSIST,signal_cb,NULL);
assert(sig_ev != NULL);
event_add(sig_ev,NULL);

//定义定时事件
struct event* timeout_ev = event_new(base,-1,EV_TIMEOUT,timeout_cb,NULL);
struct timeval tv = {3,0};//指3秒0微秒
event_add(timeout_ev,&tv);

//启动事件循环
event_base_dispatch(base);
//阻塞在这里 内部进行循环 并且libevent会根据情况去选择使用select,poll,或eopll

//释放事件与实例
event_free(sig_ev);
event_free(timeout_ev);
event_base_free(base);
}

libevent入门教程:简单示例
https://blog.jackeylea.com/libevent/simple-example-of-libevent/
作者
JackeyLea
发布于
2024年8月1日
许可协议