1. 程式人生 > >libevent 學習:官方案例 signal-test

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訊號列表