Libevent 信号

目录

Note

利用Libevent创建监听集合,将信号事件绑定并放入监听集合中,一旦监听到有信号发生便会触发

信号事件

注意:编译的时候要加libevent库, gcc 信号.c -o 信号 -levent

/****************************************************************************
Libevent 也可以监听信号
  //创建事件集合的方法:使用event_init函数 或者 直接使用 event_base_new
  struct event_base *event_init(void)
  {
	struct event_base *base = event_base_new_with_config(NULL);

	if (base == NULL) {
		event_errx(1, "%s: Unable to construct event_base", __func__);
		return NULL;
	}

	current_base = base;

	return (base);
  }

  struct event_base *event_base_new(void)
  {
	struct event_base *base = NULL;
	struct event_config *cfg = event_config_new();
	if (cfg) {
		base = event_base_new_with_config(cfg);
		event_config_free(cfg);
	}
	return base;
  }

  //把事件和集合绑定,event_set默认把事件与全局变量集合绑定,而event_assign则可以把事件ev和指定current_base集合绑定
  void event_set(struct event *ev, evutil_socket_t fd, short events,
	  void (*callback)(evutil_socket_t, short, void *), void *arg)
  {
	int r;
	r = event_assign(ev, current_base, fd, events, callback, arg);
	EVUTIL_ASSERT(r == 0);
  }
*******************************************************************************/

#include <stdio.h>
#include <signal.h>
#include <event.h>

int signal_count = 0;
void signal_handler(evutil_socket_t fd, short events, void *arg)
{
	struct event *ev = (struct event *)arg;
	printf("收到信号 %d \n", fd);

	signal_count++;
	if(signal_count >= 2)
	{
		//把事件从集合中删除
		event_del(ev);
	}
}

int main()
{
	//创建事件集合,ps:记得释放集合
	struct event_base *base = event_base_new();

	//创建事件
	struct event ev;

	//将事件和信号绑定
	//参数:事件 集合 信号(crtl+c) 类型 回调函数 回调函数入参(把集合传给回调,用于达到一定条件终止循环)
	event_assign(&ev, base, SIGINT, EV_SIGNAL | EV_PERSIST, signal_handler, &ev);

	//事件添加到集合中
	event_add(&ev, NULL);

	//监听集合(自己创建的集合,不使用event_dispatch默认监听全局变量集合)
	//event_dispatch();
	event_base_dispatch(base);

	//释放集合
	event_base_free(base);

	return 0;
}

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦