libevent 学习:官方案例 signal-test

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

参考:

libevent Documentation

Linux信号列表

猜你喜欢

转载自blog.csdn.net/guangyacyb/article/details/86221148
今日推荐