版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guangyacyb/article/details/86221148
路径:libevent-2.1.8-stable/sample
文件 signal-test.c
这个案例实现的是一个不断监听中断信号的事件循环,如果收到信号次数超过2次就跳出循环。
#include <sys/types.h>
#include <event2/event-config.h>
#include <sys/stat.h>
#ifndef _WIN32
#include <sys/queue.h>
#include <unistd.h>
#include <sys/time.h>
#else
#include <winsock2.h>
#include <windows.h>
#endif
#include <signal.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <event2/event.h>
int called = 0;
static void
signal_cb(evutil_socket_t fd, short event, void *arg)
{
struct event *signal = arg;
printf("signal_cb: got signal %d\n", event_get_signal(signal));
if (called >= 2)
event_del(signal);
called++;
}
int
main(int argc, char **argv)
{
struct event *signal_int;
struct event_base* base;
#ifdef _WIN32
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);
(void) WSAStartup(wVersionRequested, &wsaData);
#endif
/* Initalize the event library */
base = event_base_new();
/* Initalize one event */
signal_int = evsignal_new(base, SIGINT, signal_cb, event_self_cbarg());
event_add(signal_int, NULL);
event_base_dispatch(base);
event_free(signal_int);
event_base_free(base);
return (0);
}
编译:
gcc signal-test.c -levent -o signaltest
运行,连续输入 ctrl + c (发送中断信号),输出:
^Csignal_cb: got signal 2
^Csignal_cb: got signal 2
^Csignal_cb: got signal 2
结构体:
- event_base:保存事件(分发)循环的信息和状态
- event:单个事件
函数:
- event_get_signal:定义:#define event_get_signal(ev) ((int)event_get_fd(ev)),获取event 关联的socket或者signal,因为中断信号SIGINT 数值是2,所以以上代码每行输出末尾是2
- event_del:从监听事件集中移除,若没有监听的事件,事件循环会退出
- event_base_new:新建一个event_base
- evsignal_new:新建一个event
- event_add:将event 添加到监听的事件集
- event_base_dispatch:开启事件循环
- event_free:释放一个event
- event_base_free:释放一个event_base
参考:
扫描二维码关注公众号,回复:
4856005 查看本文章