libevent 學習:官方案例 signal-test
阿新 • • 發佈:2019-01-10
路徑: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
參考: