libevent 学习笔记<一>
Libevent是一个编写快速可移植(portable)的非阻塞IO程序的库。主要特性有:跨平台、高速、扩展性强、方便等等。还提供了事件缓冲,http,dns等的cs实现,rpc实现。
Libevent 中的Log消息
Libevent可以对内部错误记录日志并发出警告,也可以记录debug消息,这需要编译的时候支持相关选项。默认这些消息写到标准错误流。你可以在你自己的日志记录函数中重写这些行为。
接口
#define EVENT_LOG_DEBUG 0 #define EVENT_LOG_MSG 1 #define EVENT_LOG_WARN 2 #define EVENT_LOG_ERR 3 /* Deprecated; see note at the end of this section */ #define _EVENT_LOG_DEBUG EVENT_LOG_DEBUG #define _EVENT_LOG_MSG EVENT_LOG_MSG #define _EVENT_LOG_WARN EVENT_LOG_WARN #define _EVENT_LOG_ERR EVENT_LOG_ERR typedef void (*event_log_cb)(int severity, const char *msg); void event_set_log_callback(event_log_cb cb);
重写libevent的日志行为,要自定义一个函数匹配event_log_cb中的标志位,并将该函数作为一个参数传递给event_set_log_callback().当Libevent需要日志消息时,将会把该消息传递到你定义的函数。通过将event_set_log_callback()中的参数置NULL,执行默认行为。
Examples
#include <event2/event.h> #include <stdio.h> static void discard_cb(int severity, const char *msg) { /* This callback does nothing. */ } static FILE *logfile = NULL; static void write_to_file_cb(int severity, const char *msg) { const char *s; if (!logfile) return; switch (severity) { case _EVENT_LOG_DEBUG: s = "debug"; break; case _EVENT_LOG_MSG: s = "msg"; break; case _EVENT_LOG_WARN: s = "warn"; break; case _EVENT_LOG_ERR: s = "error"; break; default: s = "?"; break; /* never reached */ } fprintf(logfile, "[%s] %s\n", s, msg); } /* Turn off all logging from Libevent. */ void suppress_logging(void) { event_set_log_callback(discard_cb); } /* Redirect all Libevent log messages to the C stdio file 'f'. */ void set_logfile(FILE *f) { logfile = f; event_set_log_callback(write_to_file_cb); }
注意
使用用户自定义的event_log_cb回调函数来唤醒Libevent函数是不安全的!例如,如果你尝试在回调函数中调用bufferevents发送一个警告消息到socket,可能会引发难以察觉的bug。
正常情况下debug日志是不开启的,可以手动开启。这部分暂时略过。
Handling fatal errors
当Libevent遇到一个不能恢复的内部错误(比如数据结构崩溃),默认动作是调用exit()或者abort()来退出当前进程。这些错误基本上说明肯定存在一个bug:在libevent的代码中或者是用户代码中。
你可有重写libevent的行为,如果你想让自己的程序来更优雅的处理错误,可以提供一个函数供libevent调用。
typedef void (*event_fatal_cb)(int err); void event_set_fatal_callback(event_fatal_cb cb);
为了使用这个函数,你要首先自定义一个函数用来处理错误,并将它作为参数传递给event_set_fatal_callback()。

浙公网安备 33010602011771号