libevent 学习:官方案例 signal-test

路径: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

 

参考:

libevent Documentation

Linux信号列表

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值