{"id":5485,"date":"2021-08-17T18:44:13","date_gmt":"2021-08-17T10:44:13","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=5485"},"modified":"2021-08-17T18:44:13","modified_gmt":"2021-08-17T10:44:13","slug":"%e3%80%8alibevent%e6%b7%b1%e5%85%a5%e6%b5%85%e5%87%ba%e3%80%8b-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/5485","title":{"rendered":"\u300alibevent\u6df1\u5165\u6d45\u51fa\u300b \u5b66\u4e60\u7b14\u8bb0"},"content":{"rendered":"<header class=\"Post-Header\">\n<div class=\"Post-Author\">\n<div class=\"AuthorInfo\">\n<div class=\"AuthorInfo\">\n<div class=\"ztext AuthorInfo-badgeText\"><a href=\"https:\/\/zhuanlan.zhihu.com\/p\/396257690\">\u539f\u6587\u5730\u5740<\/a><\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/header>\n<div class=\"Post-RichTextContainer\">\n<div class=\"RichText ztext Post-RichText css-hnrfcf\">\n<h3><b>Libevent\u7279\u70b9\uff1a<\/b><\/h3>\n<ul>\n<li>\u4e8b\u4ef6\u9a71\u52a8\uff0c\u9ad8\u6027\u80fd<\/li>\n<li>\u8f7b\u91cf\u7ea7\uff0c\u4e13\u6ce8\u4e8e\u7f51\u7edc<\/li>\n<li>\u8de8\u5e73\u53f0\uff0c\u652f\u6301Windows,linux,Mac os\u7b49<\/li>\n<li>\u652f\u6301\u591a\u79cdI\/O\u590d\u7528\u6280\u672f\uff0cepoll,poll,dev\/poll,select \u548ckqueue\u7b49<\/li>\n<li>\u652f\u6301I\/O\uff0c\u5b9a\u65f6\u5668\u548c\u4fe1\u53f7\u7b49\u4e8b\u4ef6<\/li>\n<\/ul>\n<h3><b>\u521b\u5efaevent_base<\/b><\/h3>\n<h3>\u521b\u5efa\u9ed8\u8ba4\u7684event_base<\/h3>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"cm\">\/*\r\n<\/span><span class=\"cm\">@brief create default event_base\r\n<\/span><span class=\"cm\">@return struct event_base*: a pointer to struct event_base or failure return NULL\r\n<\/span><span class=\"cm\">*\/<\/span>\r\n<span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"nf\">event_base_new<\/span><span class=\"p\">(<\/span><span class=\"kt\">void<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/\u91ca\u653eevent_base\r\n<\/span><span class=\"kt\">void<\/span> <span class=\"nf\">event_base_free<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"n\">base<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<h3><b>\u521b\u5efa\u590d\u6742\u7684event_base<\/b><\/h3>\n<p>\u5982\u679c\u9700\u8981\u5bf9event_base\u6709\u66f4\u591a\u7684\u63a7\u5236\uff0c\u9700\u8981\u4f7f\u7528event_config<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"cm\">\/*\r\n<\/span><span class=\"cm\">@brief create a default event_config\r\n<\/span><span class=\"cm\">@return event_config* :failure to return null\r\n<\/span><span class=\"cm\">*\/<\/span>\r\n<span class=\"k\">struct<\/span> <span class=\"n\">event_config<\/span> <span class=\"o\">*<\/span><span class=\"nf\">event_config_new<\/span><span class=\"p\">(<\/span><span class=\"kt\">void<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/create a event_base with event_config\r\n<\/span><span class=\"k\">struct<\/span> <span class=\"nf\">event_base_new_with_config<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event_config<\/span><span class=\"o\">*<\/span><span class=\"n\">cfg<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/free event_config\r\n<\/span><span class=\"kt\">void<\/span> <span class=\"nf\">event_config_free<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_config<\/span><span class=\"o\">*<\/span> <span class=\"n\">cfg<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u8981\u914d\u7f6e\u590d\u6742\u7684event_base\uff0c\u5148\u8c03\u7528event_config_new()\u5206\u914devent_config,\u7136\u540e\u5bf9event_config\u8c03\u7528\u5176\u4ed6\u51fd\u6570\uff0c\u8bbe\u7f6e\u6240\u9700\u8981\u7684event_base\u7279\u5f81\u3002\u6700\u540e\u8c03\u7528event_base_new_with_config()\u83b7\u53d6\u65b0\u7684event_base,\u5b8c\u6210\u4e4b\u540e\u4f7f\u7528event_config_free()\u91ca\u653eevent_config.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"c1\">\/\/\u901a\u8fc7\u540d\u5b57 \u8bbe\u7f6elibevent\u4e0d\u4f7f\u7528\u7279\u5b9a\u7684\u53ef\u7528\u540e\u7aef\r\n<\/span><span class=\"kt\">int<\/span> <span class=\"nf\">event_config_avoid_method<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_config<\/span> <span class=\"o\">*<\/span><span class=\"n\">cfg<\/span><span class=\"p\">,<\/span><span class=\"k\">const<\/span> <span class=\"kt\">char<\/span><span class=\"o\">*<\/span> <span class=\"n\">method<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/\u8bbe\u7f6elibevent \u4e0d\u4f7f\u7528\u4e0d\u80fd\u63d0\u4f9b\u6307\u5b9a\u7279\u5f81\u7684\u540e\u7aef\r\n<\/span><span class=\"k\">enum<\/span> <span class=\"n\">event_method_feature<\/span><span class=\"p\">{<\/span>\r\n  <span class=\"n\">EV_FEATURE_ET<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x01<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/\u8981\u6c42\u652f\u6301\u8fb9\u6cbf\u89e6\u53d1\u7684\u540e\u7aef\r\n<\/span>  <span class=\"n\">EV_FEATURE_O1<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x02<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u8981\u6c42\u6dfb\u52a0\uff0c\u5220\u9664\u5355\u4e2a\u4e8b\u4ef6\uff0c\u6216\u8005\u786e\u5b9a\u54ea\u4e2a\u4e8b\u4ef6\u6fc0\u6d3b\u7684\u64cd\u4f5c\u662fO(1)\u590d\u6742\u5ea6\u7684\u540e\u7aef\r\n<\/span>  <span class=\"n\">EV_FEATURE_FDS<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x04<\/span> <span class=\"c1\">\/\/ \u8981\u6c42\u652f\u6301\u4efb\u610f\u6587\u4ef6\u63cf\u8ff0\u7b26\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u5957\u63a5\u5b57\u7684\u540e\u7aef\r\n<\/span><span class=\"p\">};<\/span>\r\n<span class=\"c1\">\/\/\u8bbe\u7f6e\u6210\u529f\u8fd4\u56de0\uff0c\u5931\u8d25\u8fd4\u56de-1\r\n<\/span><span class=\"kt\">int<\/span> <span class=\"nf\">event_config_require_features<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_config<\/span> <span class=\"o\">*<\/span><span class=\"n\">cfg<\/span><span class=\"p\">,<\/span>\r\n                                  <span class=\"k\">enum<\/span> <span class=\"n\">event_method_feature<\/span> <span class=\"n\">feature<\/span><span class=\"p\">);<\/span>\r\n<span class=\"err\">\u200b<\/span>\r\n<span class=\"c1\">\/\/\u8bbe\u7f6e\u521b\u5efaevent_base\u65f6\u8bbe\u7f6e\u4e00\u4e2a\u6d3b\u7740\u591a\u4e2a\u8fd0\u884c\u65f6\u7684\u6807\u5fd7\r\n<\/span><span class=\"k\">enum<\/span> <span class=\"n\">event_base_config_flag<\/span><span class=\"p\">{<\/span>\r\n  <span class=\"n\">EVENT_BASE_FLAG_NOLOCK<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x01<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/\u4e0d\u8981\u4e3aevent_base\u5206\u914d\u9501\uff0c\u5bb9\u6613\u9020\u6210\u591a\u7ebf\u7a0b\u4e0d\u5b89\u5168\r\n<\/span>  <span class=\"n\">EVENT_BASE_FLAG_IGNORE_ENV<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x02<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u4f7f\u7528\u7684\u540e\u7aef\uff0c\u4e0d\u8981\u68c0\u6d4bEVENT*\u73af\u5883\u53d8\u91cf\uff0c\u4f7f\u7528\u8fd9\u4e2a\u6807\u5fd7\u548c\u66f4\u96be\u8c03\u8bd5\r\n<\/span>  <span class=\"n\">EVENT_BASE_FLAG_STARTUO_IOCP<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x04<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/\u4ec5\u4ec5\u7528\u4e8eWINDOWS,\u8ba9libevent\u5728\u542f\u52a8\u65f6\u5c31\u542f\u7528\u4efb\u4f55\u5fc5\u9700\u7684IOCP\u5206\u53d1\u903b\u8f91\uff0c\u800c\u4e0d\u662f\u6309\u9700\u542f\u7528\r\n<\/span>  <span class=\"n\">EVENT_BASE_FLAG_NO_CACHE_TIME<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x08<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u5728\u6bcf\u6b21\u8d85\u65f6\u56de\u8c03\u540e\u8fdb\u884c\u68c0\u6d4b\u5f53\u524d\u65f6\u95f4\r\n<\/span>  <span class=\"n\">EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x10<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/\u5982\u679c\u679c\u51b3\u5b9a\u4f7f \u7528 epoll \u540e\u7aef,\u53ef\u4ee5\u5b89\u5168\u5730\u4f7f\u7528\u66f4\u5feb\u7684\u57fa\u4e8e changelist \u7684\u540e\u7aef\u3002\u4f46\u662f\u5982\u679c\u4f20\u9012\u4efb\u4f55\u4f7f\u7528 dup()\u6216\u8005\u5176\u53d8\u4f53\u514b\u9686\u7684 fd \u7ed9 libevent,epoll-changelist \u540e\u7aef\u4f1a\u89e6\u53d1\u4e00\u4e2a\u5185\u6838 bug,\u5bfc\u81f4\u4e0d\u6b63\u786e\u7684\u7ed3\u679c\uff0c EVENT_EPOLL_USE_CHANGELIST\u73af\u5883\u53d8\u91cf\u7528\u4e8e\u6253\u5f00epoll-changelist\r\n<\/span>  <span class=\"n\">EVENT_BASE_FLAG_PRECISE_TIMER<\/span> <span class=\"o\">=<\/span> <span class=\"mh\">0x20<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/\u662f\u5426\u4f7f\u7528\u66f4\u7cbe\u51c6\u7684\u65f6\u95f4\r\n<\/span><span class=\"p\">};<\/span>\r\n<span class=\"c1\">\/\/\u8bbe\u7f6e\u6210\u529f\u8fd4\u56de0\uff0c\u5931\u8d25\u8fd4\u56de-1\r\n<\/span><span class=\"kt\">int<\/span> <span class=\"nf\">event_config_set_flag<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_config<\/span> <span class=\"o\">*<\/span><span class=\"n\">cfg<\/span><span class=\"p\">,<\/span>\r\n                         <span class=\"k\">enum<\/span> <span class=\"n\">event_base_config_flag<\/span> <span class=\"n\">flag<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<h3>\u68c0\u67e5event_base<\/h3>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"c1\">\/\/\u8fd4\u56de\u4e00\u4e2a\u6307\u9488\uff0c\u6307\u5411libevent\u652f\u6301\u7684\u65b9\u6cd5\u7684\u540d\u5b57\u6570\u5b57\uff0c\u6570\u7ec4\u7684\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u662fNULL\r\n<\/span><span class=\"k\">const<\/span> <span class=\"kt\">char<\/span> <span class=\"o\">**<\/span><span class=\"nf\">event_get_supported_methods<\/span><span class=\"p\">(<\/span><span class=\"kt\">void<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/\u83b7\u53d6\u5f53\u524devent_base\u6b63\u5728\u4f7f\u7528\u7684\u65b9\u6cd5\r\n<\/span><span class=\"k\">const<\/span> <span class=\"kt\">char<\/span><span class=\"o\">*<\/span> <span class=\"nf\">eevnt_base_get_method<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span><span class=\"o\">*<\/span> <span class=\"n\">base<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/\u8fd4\u56deevent_base\u652f\u6301\u7684\u7279\u5f81\u7684\u6bd4\u7279\u63a9\u7801\r\n<\/span><span class=\"k\">enum<\/span> <span class=\"n\">event_method_feature<\/span> <span class=\"nf\">event_base_get_features<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span><span class=\"o\">*<\/span> <span class=\"n\">base<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<h3>\u8bbe\u7f6eevent_base\u4f18\u5148\u7ea7<\/h3>\n<p>libevent\u652f\u6301\u4e3a\u591a\u4e2a\u4e8b\u4ef6\u8bbe\u7f6e\u4f18\u5148\u7ea7\uff0cevent_base\u9ed8\u8ba4\u53ea\u652f\u6301\u5355\u4e2a\u4f18\u5148\u7ea7\uff0c\u53ef\u4ee5\u8c03\u7528event_base_priority_init()\u8bbe\u7f6eevent_base\u7684\u4f18\u5148\u7ea7\uff0c\u5fc5\u987b\u5728\u4efb\u4f55\u4e8b\u4ef6\u6fc0\u6d3b\u4e4b\u524d\u8c03\u7528\uff0c\u6700\u597d\u5728\u521b\u5efaevent_base\u4e4b\u540e\u8c03\u7528<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"c1\">\/\/\u6210\u529f\u8fd4\u56de0 \u5931\u8d25\u8fd4\u56de-1\uff0c\u5e38\u91cfEVENT_MAX_PRIORITIES\u8868\u793an_priorities\u7684\u4e0a\u9650\u3002\u6bcf\u4e2a\u65b0\u4e8b\u4ef6\u7684\u4f18\u5148\u7ea7\u5c06\u4ece0\uff08\u6700\u9ad8\uff09\u5230n_priorities-1\u6700\u4f4e\r\n<\/span><span class=\"kt\">int<\/span> <span class=\"nf\">event_base_priority_init<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span><span class=\"o\">*<\/span> <span class=\"n\">base<\/span><span class=\"p\">,<\/span><span class=\"kt\">int<\/span> <span class=\"n\">n_priorities<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<h3>\u7ed3\u5408fork<\/h3>\n<p>\u5982\u679c\u5728\u65b0\u8fdb\u7a0b\u4e2d\u9700\u8981\u7ee7\u7eed\u4f7f\u7528event_base\uff0c\u5c31\u9700\u8981\u8fdb\u884c\u91cd\u65b0\u521d\u59cb\u5316\u3002<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"c1\">\/\/\u6210\u529f\u8fd4\u56de0 \u5931\u8d25\u8fd4\u56de-1\r\n<\/span><span class=\"kt\">int<\/span> <span class=\"nf\">event_reinit<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"n\">base<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<h3>\u521b\u5efa\u4e8b\u4ef6event<\/h3>\n<p>\u4f7f\u7528event_new()\u63a5\u53e3\u521b\u5efa\u4e8b\u4ef6<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"cp\">#define EV_TIMOUT   0x01 <\/span><span class=\"c1\">\/\/\u8868\u793a\u4e8b\u4ef6\u8d85\u65f6\u540e\u6094\u53d8\u6210\u6fc0\u6d3b\u7684\r\n<\/span><span class=\"cp\">#define EV_READ     0x02 <\/span><span class=\"c1\">\/\/\u8868\u793a\u6307\u5b9a\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u8bfb\u4e8b\u4ef6\u5c31\u7eea\r\n<\/span><span class=\"cp\">#define EV_WRITE    0x04 <\/span><span class=\"c1\">\/\/\u8868\u793a\u6307\u5b9a\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26 \u5199\u4e8b\u4ef6\u5c31\u7eea\r\n<\/span><span class=\"cp\">#define EV_SIGNAL   0x08 <\/span><span class=\"c1\">\/\/ \u7528\u4e8e\u5b9e\u73b0\u4fe1\u53f7\u68c0\u6d4b\r\n<\/span><span class=\"cp\">#define EV_PERSISIT 0x10 <\/span><span class=\"c1\">\/\/\u8868\u793a\u4e8b\u4ef6\u662f\u6301\u4e45\u7684\r\n<\/span><span class=\"cp\">#define EV_ET       0x20 <\/span><span class=\"c1\">\/\/\u5982\u679c\u652f\u6301\u8fb9\u6cbf\u89e6\u53d1\uff0c\u90a3\u4e48\u4e8b\u4ef6\u662f\u8fb9\u6cbf\u89e6\u53d1\u7684\u4f1a\u5f71\u54cdEV_READ\u548cEV_WRITE\r\n<\/span><span class=\"err\">\u200b<\/span>\r\n<span class=\"c1\">\/\/\u56de\u8c03\u51fd\u6570\r\n<\/span><span class=\"k\">typedef<\/span> <span class=\"kt\">void<\/span> <span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">event_callback_fn<\/span><span class=\"p\">)(<\/span><span class=\"n\">evutil_socket_t<\/span><span class=\"p\">,<\/span><span class=\"kt\">short<\/span><span class=\"p\">,<\/span><span class=\"kt\">void<\/span><span class=\"o\">*<\/span><span class=\"p\">);<\/span>\r\n<span class=\"err\">\u200b<\/span>\r\n<span class=\"err\">\u200b<\/span>\r\n<span class=\"c1\">\/\/\u5206\u914d\u548c\u6784\u9020\u4e00\u4e2a\u7528\u4e8ebase\u7684\u65b0\u7684\u4e8b\u4ef6\uff0cwhat\u53c2\u6570\u662f\u4e0a\u8ff0\u6807\u5fd7\u7684\u96c6\u5408\uff0c\u4e8b\u4ef6\u88ab\u6fc0\u6d3b\u65f6\uff0clibevent\u8c03\u7528cb\u51fd\u6570\uff0cfd\u662f\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002what\u8868\u793a\u89e6\u53d1\u7684\u4e8b\u4ef6\u7684\u4f4d\u5b57\u6bb5\uff0c\u4ee5\u53ca\u6784\u9020\u4e8b\u4ef6\u65f6\u7684arg\u53c2\u6570\u3002\u53d1\u751f\u9519\u8bef\u6216\u8005\u4f20\u5165\u65e0\u6548\u53c2\u6570\u65f6\uff0cevent_new()\u5c06\u8fd4\u56deNULL\r\n<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">event_new<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span><span class=\"o\">*<\/span> <span class=\"n\">base<\/span><span class=\"p\">,<\/span><span class=\"n\">evutil_socket_t<\/span> <span class=\"n\">fd<\/span><span class=\"p\">,<\/span>\r\n                        <span class=\"kt\">short<\/span> <span class=\"n\">what<\/span><span class=\"p\">,<\/span><span class=\"n\">event_callback_fn<\/span> <span class=\"n\">cb<\/span><span class=\"p\">,<\/span>\r\n                        <span class=\"kt\">void<\/span> <span class=\"o\">*<\/span><span class=\"n\">args<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/\u91ca\u653eevent \u4e8b\u4ef6\u3002\u5bf9\u4e8e\u672a\u51b3\u7684\u83b7\u77e5\u6fc0\u6d3b\u72b6\u6001\u7684\u4e8b\u4ef6\u8c03\u7528event_free()\u662f\u5b89\u5168\u7684\uff0c\u5728\u91ca\u653e\u4e8b\u4ef6\u4e4b\u524d\uff0c\u51fd\u6570\u4f1a\u5c06\u4e8b\u4ef6\u6210\u4e3a\u975e\u6fc0\u6d3b\u7684\u548c\u975e\u672a\u51b3\u7684\u3002\r\n<\/span><span class=\"kt\">void<\/span> <span class=\"nf\">event_free<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">event<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u4e8b\u4ef6\u7684\u6301\u4e45\u6027\uff0c\u5982\u679c\u60f3\u5728\u56de\u8c03\u4e2d\u8ba9\u4e8b\u4ef6\u6210\u4e3a\u975e\u672a\u51b3\u7684\uff0c\u53ef\u4ee5\u5bf9\u5176\u8c03\u7528event_del().\u6bcf\u6b21\u6267\u884c\u4e8b\u4ef6\u56de\u8c03\u7684\u65f6\u5019\uff0c\u6301\u4e45\u4e8b\u4ef6\u7684\u8d85\u65f6\u503c\u4f1a\u88ab\u590d\u4f4d\u3002<\/p>\n<p>\u4fe1\u53f7\u4e8b\u4ef6\uff0clibevent\u53ef\u4ee5\u68c0\u6d4b\u4fe1\u53f7\u4e8b\u4ef6\uff0c\u5904\u7406\u63d0\u4f9b\u4e00\u4e2a\u4fe1\u53f7\u7f16\u53f7\u4ee3\u66ff\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e4b\u5916\uff0c\u5404\u4e2a\u53c2\u6570\u4e0eevent_new()\u76f8\u540c<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"cp\">#define evsignal_new(base,signum,cb,arg) \\\r\n<\/span><span class=\"cp\">        event_new(base,signum,EV_SIGNAL|EV_PERSIST,cb,arg)<\/span><\/code><\/pre>\n<\/div>\n<p>libevent\u6709\u4ee5\u4e0b\u7684\u5b8f\u7528\u6765\u5904\u7406\u4fe1\u53f7\u4e8b\u4ef6<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"cp\">#define evsignale_add(ev,tv) \\\r\n<\/span><span class=\"cp\">        event_add((ev),(tv))\r\n<\/span><span class=\"cp\">#define evsignal_del(ev) \\\r\n<\/span><span class=\"cp\">        event_del(ev)\r\n<\/span><span class=\"cp\">#define evsignal_pending(ev,what,tv_out) \\\r\n<\/span><span class=\"cp\">        event_pending((ev),(what),(tv_out))<\/span><\/code><\/pre>\n<\/div>\n<p>\u8bbe\u7f6e\u672a\u51b3\u4e8b\u4ef6\uff1a<\/p>\n<p>\u6dfb\u52a0\u4e8b\u4ef6\uff0c\u5982\u679c\u6dfb\u52a0\u6210\u529f\u8fd4\u56de0\uff0c\u5931\u8d25\u8fd4\u56de-1\uff0c\u5982\u679ctv\u4e3aNULL,\u6dfb\u52a0\u7684\u4e8b\u4ef6\u4e0d\u4f1a\u8d85\u65f6\uff0c\u5426\u5219\u8d85\u65f6\u65f6\u95f4\u672atv\u4e2d\u8bbe\u7f6e\u7684\u503c<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">event_add<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">ev<\/span><span class=\"p\">,<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">timeval<\/span> <span class=\"o\">*<\/span><span class=\"n\">tv<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u8bbe\u7f6e\u975e\u672a\u51b3\u4e8b\u4ef6<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">event_del<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">ev<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u5bf9\u5df2\u7ecf\u521d\u59cb\u5316\u7684\u4e8b\u4ef6\u8c03\u7528 event_del()\u5c06\u4f7f\u5176\u6210\u4e3a\u975e\u672a\u51b3\u548c\u975e\u6fc0\u6d3b\u7684\u3002\u5982\u679c\u4e8b\u4ef6\u4e0d\u662f\u672a\u51b3\u7684\u6216\u8005\u6fc0\u6d3b\u7684,\u8c03\u7528\u5c06\u6ca1\u6709\u6548\u679c\u3002\u6210\u529f\u65f6\u51fd\u6570\u8fd4\u56de 0,\u5931\u8d25\u65f6\u8fd4\u56de-1\u3002\u56de\u8c03\u5728\u6267\u884c\u524d\u5220\u9664\u4e8b\u4ef6\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u3002<\/p>\n<p>\u8bbe\u7f6e\u4e8b\u4ef6\u7684\u4f18\u5148\u7ea7\uff1a<\/p>\n<p>\u5728\u521d\u59cb\u5316\u4e8b\u4ef6\u4e4b\u540e\uff0c\u4f46\u662f\u5728\u6dfb\u52a0\u5230event_base\u4e4b\u524d\uff0c\u53ef\u4ee5\u4e3a\u5176\u8bbe\u7f6e\u4f18\u5148\u7ea7\u3002<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">event_priority_set<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event<\/span> <span class=\"o\">*<\/span><span class=\"n\">event<\/span><span class=\"p\">,<\/span><span class=\"kt\">int<\/span> <span class=\"n\">priority<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u4e8b\u4ef6\u7684\u4f18\u5148\u7ea7\u662f\u4e00\u4e2a\u57280\u548cevent_base\u7684\u4f18\u5148\u7ea7\u51cf\u53bb1\u4e4b\u95f4\u7684\u6570\u503c\uff0c\u6210\u529f\u65f6\u51fd\u6570\u8fd4\u56de0\uff0c\u5931\u8d25\u8fd4\u56de-1.libevent\u4f1a\u6267\u884c\u9ad8\u4f18\u5148\u7ea7\u7684\u4e8b\u4ef6\uff0c\u5728\u6ca1\u6709\u9ad8\u4f18\u5148\u7ea7\u4e8b\u4ef6\u6fc0\u6d3b\u7684\u65f6\u5019\uff0c\u4f4e\u4f18\u5148\u7ea7\u4e8b\u4ef6\u624d\u4f1a\u8fd0\u884c\u3002<\/p>\n<p>\u68c0\u67e5\u4e8b\u4ef6\uff1a<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"cm\">\/**\r\n<\/span><span class=\"cm\">  Checks if a specific event is pending or scheduled.\r\n<\/span><span class=\"cm\">  @param ev an event struct previously passed to event_add()\r\n<\/span><span class=\"cm\">  @param events the requested event type; any of EV_TIMEOUT|EV_READ|\r\n<\/span><span class=\"cm\">         EV_WRITE|EV_SIGNAL\r\n<\/span><span class=\"cm\">  @param tv if this field is not NULL, and the event has a timeout,\r\n<\/span><span class=\"cm\">         this field is set to hold the time at which the timeout will\r\n<\/span><span class=\"cm\">     expire.\r\n<\/span><span class=\"cm\">  @return true if the event is pending on any of the events in 'what', (that\r\n<\/span><span class=\"cm\">  is to say, it has been added), or 0 if the event is not added.\r\n<\/span><span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">int<\/span> <span class=\"nf\">event_pending<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">ev<\/span><span class=\"p\">,<\/span><span class=\"kt\">short<\/span> <span class=\"n\">what<\/span><span class=\"p\">,<\/span><span class=\"k\">struct<\/span> <span class=\"n\">timeval<\/span><span class=\"o\">*<\/span> <span class=\"n\">tv_out<\/span><span class=\"p\">);<\/span>\r\n<span class=\"err\">\u200b<\/span>\r\n<span class=\"cp\">#define event_get_signal(ev) ((int)event_get_fd(ev))\r\n<\/span><span class=\"cm\">\/**\r\n<\/span><span class=\"cm\">   Get the socket or signal assigned to an event, or -1 if the event has\r\n<\/span><span class=\"cm\">   no socket.\r\n<\/span><span class=\"cm\">\u200b\r\n<\/span><span class=\"cm\">evutil_socket_t event_get_fd(const struct event* ev);\r\n<\/span><span class=\"cm\">\/**\r\n<\/span><span class=\"cm\">   Get the event_base associated with an event.\r\n<\/span><span class=\"cm\">*\/<\/span>\r\n<span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"n\">event_get_base<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">ev<\/span><span class=\"p\">);<\/span>\r\n<span class=\"cm\">\/**\r\n<\/span><span class=\"cm\">   Return the events (EV_READ, EV_WRITE, etc) assigned to an event.\r\n<\/span><span class=\"cm\">*\/<\/span>\r\n<span class=\"kt\">short<\/span> <span class=\"nf\">event_get_events<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event<\/span> <span class=\"o\">*<\/span><span class=\"n\">ev<\/span><span class=\"p\">);<\/span>\r\n<span class=\"cm\">\/**\r\n<\/span><span class=\"cm\">   Return the callback assigned to an event.\r\n<\/span><span class=\"cm\">*\/<\/span>\r\n<span class=\"n\">event_callback_fn<\/span> <span class=\"nf\">event_get_callback<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">ev<\/span><span class=\"p\">);<\/span>\r\n<span class=\"cm\">\/**\r\n<\/span><span class=\"cm\">   Return the callback argument assigned to an event.\r\n<\/span><span class=\"cm\">*\/<\/span>\r\n<span class=\"kt\">void<\/span> <span class=\"o\">*<\/span><span class=\"nf\">event_get_callback_arg<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">ev<\/span><span class=\"p\">);<\/span>\r\n<span class=\"err\">\u200b<\/span>\r\n<span class=\"kt\">int<\/span> <span class=\"n\">event_get_priority<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">ev<\/span><span class=\"p\">);<\/span>\r\n<span class=\"cm\">\/**\r\n<\/span><span class=\"cm\">   Extract _all_ of arguments given to construct a given event.  The\r\n<\/span><span class=\"cm\">   event_base is copied into *base_out, the fd is copied into *fd_out, and so\r\n<\/span><span class=\"cm\">   on.\r\n<\/span><span class=\"cm\">   If any of the \"_out\" arguments is NULL, it will be ignored.\r\n<\/span><span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">void<\/span> <span class=\"nf\">event_get_assignment<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">event<\/span><span class=\"p\">,<\/span>\r\n                         <span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">**<\/span><span class=\"n\">base_out<\/span><span class=\"p\">,<\/span>\r\n                         <span class=\"n\">evutil_socket_t<\/span> <span class=\"o\">*<\/span><span class=\"n\">fd_out<\/span><span class=\"p\">,<\/span>\r\n                         <span class=\"kt\">short<\/span> <span class=\"o\">*<\/span><span class=\"n\">events_out<\/span><span class=\"p\">,<\/span>\r\n                         <span class=\"n\">event_callback_fn<\/span><span class=\"o\">*<\/span> <span class=\"n\">callback_out<\/span><span class=\"p\">,<\/span>\r\n                         <span class=\"kt\">void<\/span> <span class=\"o\">**<\/span><span class=\"n\">arg_out<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u4e00\u6b21\u89e6\u53d1\u4e8b\u4ef6<\/p>\n<p>\u5982\u679c\u4e0d\u9700\u8981\u591a\u6b21\u6dfb\u52a0\u4e00\u4e2a\u4e8b\u4ef6\uff0c\u6216\u8005\u8981\u5728\u6dfb\u52a0\u540e\u7acb\u5373\u5220\u9664\u4e8b\u4ef6\uff0c\u800c\u4e8b\u4ef6\u53c8\u4e0d\u9700\u8981\u662f\u6301\u4e45\u7684\uff0c\u5219\u53ef\u4ee5\u4f7f\u7528event_base_once()\uff0c\u4e0d\u652f\u6301EV_SIGNAL\u548cEV_PERSIST\u3002\u5b89\u6392\u7684\u4e8b\u4ef6\u5c06\u4ee5\u9ed8\u8ba4\u7684\u4f18\u5148\u7ea7\u52a0\u5165\u5230event_base\u5e76\u6267\u884c\u3002\u6267\u884c\u5b8c\u6210\u540e\uff0c\u4f1a\u91ca\u653eevent\u7ed3\u6784\uff0c\u6210\u529f\u65f6\u8fd4\u56de0\uff0c\u5931\u8d25\u65f6\u8fd4\u56de-1\u3002<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">event_base_once<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"n\">base<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">evutil_socket_t<\/span> <span class=\"n\">fd<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"kt\">short<\/span> <span class=\"n\">what<\/span>\r\n                   <span class=\"n\">event_callback_fn<\/span> <span class=\"n\">cb<\/span><span class=\"p\">,<\/span>\r\n                   <span class=\"kt\">void<\/span> <span class=\"o\">*<\/span><span class=\"n\">arg<\/span><span class=\"p\">,<\/span><span class=\"k\">const<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">timeval<\/span><span class=\"o\">*<\/span> <span class=\"n\">tv<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u624b\u52a8\u6fc0\u6d3b\u4e8b\u4ef6\uff1a<\/p>\n<p>\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u9700\u8981\u5728\u4e8b\u4ef6\u7684\u6761\u4ef6\u6ca1\u6709\u89e6\u53d1\u7684\u65f6\u5019\u8ba9\u4e8b\u4ef6\u6fc0\u6d3b\u3002<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">void<\/span> <span class=\"nf\">event_active<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event<\/span><span class=\"o\">*<\/span> <span class=\"n\">ev<\/span><span class=\"p\">,<\/span><span class=\"kt\">int<\/span> <span class=\"n\">what<\/span><span class=\"p\">,<\/span><span class=\"kt\">short<\/span> <span class=\"n\">ncalls<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<figure data-size=\"normal\"><img decoding=\"async\" class=\"origin_image zh-lightbox-thumb lazy\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-e3ee57daf533bb57477c5b3c89c27a36_720w.jpg\" width=\"1286\" data-caption=\"\" data-size=\"normal\" data-rawwidth=\"1286\" data-rawheight=\"1100\" data-original=\"https:\/\/pic3.zhimg.com\/v2-e3ee57daf533bb57477c5b3c89c27a36_r.jpg\" data-actualsrc=\"https:\/\/pic3.zhimg.com\/v2-e3ee57daf533bb57477c5b3c89c27a36_b.jpg\" data-lazy-status=\"ok\" \/><\/figure>\n<h3>\u4e8b\u4ef6\u5faa\u73af<\/h3>\n<p>\u4e00\u65e6\u6709\u4e86\u4e00\u4e2a\u5df2\u7ecf\u6ce8\u518c\u4e86\u7684\u67d0\u4e9b\u4e8b\u4ef6\u7684event_base\uff0c\u5c31\u9700\u8981\u8ba9libevent\u7b49\u5f85\u4e8b\u4ef6\u5e76\u4e14\u901a\u77e5\u4e8b\u4ef6\u7684\u53d1\u751f\u3002<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"cp\">#define EVLOOP_ONCE             0x01\r\n<\/span><span class=\"cp\">#define EVLOOP_NOBLOCK          0x02\r\n<\/span><span class=\"cp\">#define EVLOOP_NO_EXIT_ON_EMPTY  0x04\r\n<\/span><span class=\"err\">\u200b<\/span>\r\n<span class=\"kt\">int<\/span> <span class=\"n\">event_base_loop<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"n\">base<\/span><span class=\"p\">,<\/span><span class=\"kt\">int<\/span> <span class=\"n\">flags<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cevent_base_loop()\u51fd\u6570\u8fd0\u884cevent_base\u76f4\u5230\u5176\u4e2d\u6ca1\u6709\u5df2\u7ecf\u6ce8\u518c\u7684\u4e8b\u4ef6\u4e3a\u6b62\u3002<\/p>\n<p>flag: EVLOOP_ONCE\u5faa\u73af\u5c06\u7b49\u5f85\u67d0\u4e9b\u4e8b\u4ef6\u6210\u4e3a\u6fc0\u6d3b\u7684 ,\u6267\u884c\u6fc0\u6d3b\u7684\u4e8b\u4ef6\u76f4\u5230\u6ca1\u6709\u66f4\u591a\u7684\u4e8b\u4ef6\u53ef\u4ee5\u6267\u884c,\u7136\u4f1a\u8fd4\u56de\u3002\u5982\u679c\u8bbe\u7f6e\u4e86 EVLOOP_NONBLOCK,\u5faa\u73af\u4e0d\u4f1a\u7b49\u5f85\u4e8b\u4ef6\u88ab\u89e6\u53d1: \u5faa\u73af\u5c06\u4ec5\u4ec5\u68c0\u6d4b\u662f\u5426\u6709\u4e8b\u4ef6\u5df2\u7ecf\u5c31\u7eea,\u53ef\u4ee5\u7acb\u5373\u89e6\u53d1,\u5982\u679c\u6709,\u5219\u6267\u884c\u4e8b\u4ef6\u7684\u56de\u8c03\u3002<\/p>\n<p>\u4e5f\u53ef\u4ee5\u4f7f\u7528<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">event_base_dispatch<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span><span class=\"o\">*<\/span> <span class=\"n\">base<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>event_base_dispatch()\u7b49\u540c\u4e8e\u6ca1\u6709\u8bbe\u7f6e\u6807\u5fd7\u7684event_base_loop()\u3002\u5c06\u4e00\u76f4\u8fd0\u884c\u76f4\u5230\u6ca1\u6709\u5df2\u7ecf\u6ce8\u518c\u7684\u4e8b\u4ef6\u6216\u8005\u8c03\u7528\u4e0b\u5217\u51fd\u6570<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"c1\">\/\/event_base_loopexit()\u8ba9 event_base \u5728\u7ed9\u5b9a\u65f6\u95f4\u4e4b\u540e\u505c\u6b62\u5faa\u73af\u3002\u5982\u679c tv \u53c2\u6570\u4e3a NULL, event_base \u4f1a\u7acb\u5373\u505c\u6b62\u5faa\u73af,\u6ca1\u6709\u5ef6\u65f6\u3002\r\n<\/span><span class=\"kt\">int<\/span> <span class=\"nf\">event_base_loopexit<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"n\">base<\/span><span class=\"p\">,<\/span>\r\n                        <span class=\"k\">struct<\/span> <span class=\"n\">timeval<\/span> <span class=\"o\">*<\/span><span class=\"n\">tv<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/event_base_loopbreak ()\u8ba9 event_base \u7acb\u5373\u9000\u51fa\u5faa\u73af\u3002\r\n<\/span><span class=\"kt\">int<\/span> <span class=\"nf\">event_base_loopbreak<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"n\">base<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u8f6c\u50a8event_base\u7684\u72b6\u6001\uff1a<\/p>\n<p>\u8c03\u7528event_base_dump_events()\u53ef\u4ee5\u5c06event_base\u7684\u4fe1\u606f\u8f93\u51fa\u5230\u6307\u5b9a\u7684\u6587\u4ef6\u4e2d<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">void<\/span> <span class=\"nf\">event_base_dump_events<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span><span class=\"o\">*<\/span> <span class=\"n\">base<\/span><span class=\"p\">,<\/span><span class=\"n\">FILE<\/span> <span class=\"o\">*<\/span><span class=\"n\">f<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<h3>\u6570\u636e\u7f13\u51b2Bufferevent<\/h3>\n<p>bufferevent\u7531\u4e00\u4e2a\u5e95\u5c42\u7684\u4f20\u8f93\u7aef\u53e3\uff0c\u4e00\u4e2a\u8bfb\u53d6\u7f13\u51b2\u533a\u548c\u4e00\u4e2a\u5199\u5165\u7f13\u51b2\u533a\u7ec4\u6210\u3002bufferevent\u5728\u8bfb\u53d6\u6216\u8005\u5199\u5165\u8db3\u591f\u91cf\u7684\u6570\u636e\u4e4b\u540e\u8c03\u7528\u7528\u6237\u63d0\u4f9b\u7684\u56de\u8c03\u3002\u6bcf\u4e2abufferevent\u90fd\u6709\u4e00\u4e2a\u8f93\u5165\u7f13\u51b2\u533a\u548c\u8f93\u51fa\u7f13\u51b2\u533a\uff0c\u7c7b\u578b\u90fd\u662fevbuff<\/p>\n<p>\u6bcf\u4e2abufferevent\u6709\u4e24\u4e2a\u6570\u636e\u76f8\u5173\u7684\u56de\u8c03\uff0c\u4e00\u4e2a\u8bfb\u53d6\u56de\u8c03\u548c\u4e00\u4e2a\u5199\u5165\u56de\u8c03\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4ece\u5e95\u5c42\u4f20\u8f93\u7aef\u53e3\u8bfb\u53d6\u4e86\u4efb\u610f\u91cf\u7684\u6570\u636e\u4e4b\u540e\u4f1a\u8c03\u7528\u8bfb\u53d6\u56de\u8c03\u3002\u8f93\u51fa\u7f13\u51b2\u533a\u4e2d\u8db3\u591f\u91cf\u7684\u6570\u636e\u88ab\u6e05\u7a7a\u5230\u5e95\u5c42\u4f20\u8f93\u7aef\u53e3\u540e\u8c03\u7528\u5199\u5165\u56de\u8c03\u51fd\u6570\u3002\u6bcf\u4e2abufferevent\u6709\u56db\u4e2a\u6c34\u4f4d\uff1a<\/p>\n<ul>\n<li>\u8bfb\u53d6\u4f4e\u6c34\u4f4d \uff1a \u53d6\u64cd\u4f5c\u4f7f\u5f97\u8f93\u5165\u7f13\u51b2\u533a\u7684\u6570\u636e\u91cf\u5728\u6b64\u7ea7\u522b\u6216\u8005\u66f4\u9ad8\u65f6 ,\u8bfb\u53d6\u56de\u8c03\u5c06\u88ab\u8c03\u7528\u3002\u9ed8\u8ba4\u503c\u4e3a 0,\u6240\u4ee5\u6bcf\u4e2a\u8bfb\u53d6\u64cd\u4f5c\u90fd\u4f1a\u5bfc\u81f4\u8bfb\u53d6\u56de\u8c03\u88ab\u8c03\u7528\u3002<\/li>\n<li>\u8bfb\u53d6\u9ad8\u6c34\u4f4d\uff1a\u8f93\u5165\u7f13\u51b2\u533a\u4e2d\u7684\u6570\u636e\u91cf\u8fbe\u5230\u6b64\u7ea7\u522b\u540e, bufferevent \u5c06\u505c\u6b62\u8bfb\u53d6,\u76f4\u5230\u8f93\u5165\u7f13\u51b2\u533a\u4e2d\u8db3\u591f\u91cf\u7684\u6570\u636e\u88ab\u62bd\u53d6 ,\u4f7f\u5f97\u6570\u636e\u91cf\u4f4e\u4e8e\u6b64\u7ea7\u522b<\/li>\n<li>\u5199\u5165\u4f4e\u6c34\u4f4d\uff1a\u5199\u5165\u64cd\u4f5c\u4f7f\u5f97\u8f93\u51fa\u7f13\u51b2\u533a\u7684\u6570\u636e\u91cf\u8fbe\u5230\u6216\u8005\u4f4e\u4e8e\u6b64\u7ea7\u522b\u65f6 ,\u5199\u5165\u56de\u8c03\u5c06\u88ab\u8c03\u7528<\/li>\n<li>\u5199\u5165\u9ad8\u6c34\u4f4d\uff1abufferevent \u6ca1\u6709\u76f4\u63a5\u4f7f\u7528\u8fd9\u4e2a\u6c34\u4f4d<\/li>\n<\/ul>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b,bufferevent \u7684\u56de\u8c03\u5728\u76f8\u5e94\u7684\u6761\u4ef6\u53d1\u751f\u65f6\u7acb\u5373\u88ab\u6267\u884c\uff0c\u5728\u4f9d\u8d56\u5173\u7cfb\u590d\u6742\u7684\u60c5\u51b5\u4e0b ,\u8fd9\u79cd\u7acb\u5373\u8c03\u7528\u4f1a\u5236\u9020\u9ebb\u70e6 \u3002\u8981\u89e3\u51b3\u8fd9\u6837\u7684\u9ebb\u70e6\uff0c\u53ef\u4ee5\u8bf7\u6c42bufferevent\u5ef6\u8fdf\u5176\u56de\u8c03\u3002<\/p>\n<p>\u521b\u5efabufferevent\u4f7f\u7528\u7684\u6807\u5fd7\uff1a<\/p>\n<ul>\n<li>BEV_OPT_CLOSE_ON_FREE: \u91ca\u653ebufferevent\u65f6\u5173\u95ed\u5e95\u5c42\u4f20\u8f93\u7aef\u53e3<\/li>\n<li>BEV_OPT_THREADSAFE: \u81ea\u52a8\u672abufferevent\u5206\u914d\u9501\uff0c\u591a\u7ebf\u7a0b\u5b89\u5168<\/li>\n<li>BEV_OPT_DEFER_CALLBACKS:\u8bbe\u7f6ebufferevent\u5ef6\u8fdf\u56de\u8c03<\/li>\n<li>BEV_OPT_UNLOCK_CALLBACKS:\u8bbe\u7f6ebufferevent\u5728\u6267\u884c\u56de\u8c03\u7684\u65f6\u5019\u4e0d\u8fdb\u884c\u9501\u5b9a\u3002<\/li>\n<\/ul>\n<p>\u521b\u5efa\u57fa\u4e8e\u5957\u63a5\u5b57\u7684bufferevent<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"nf\">bufferevent_socket_new<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"k\">struct<\/span> <span class=\"n\">event_base<\/span> <span class=\"o\">*<\/span><span class=\"n\">base<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">evutil_socket_t<\/span> <span class=\"n\">fd<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"k\">enum<\/span> <span class=\"n\">bufferevent_options<\/span> <span class=\"n\">options<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>options\u662f\u521b\u5efabufferevent\u4f7f\u7528\u7684\u6807\u5fd7\u7684\u63a9\u7801\uff0cfd\u662f\u5957\u63a5\u5b57\u6587\u4ef6\u63cf\u8ff0\u7b26\uff0cbase\u662fevent_base,\u6210\u529f\u65f6\u51fd\u6570\u8fd4\u56de\u4e00\u4e2abufferevent,\u5931\u8d25\u8fd4\u56deNULL\u3002<\/p>\n<p>\u542f\u52a8\u94fe\u63a5\uff1a<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">bufferevent_socket_connect<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bev<\/span><span class=\"p\">,<\/span>\r\n                            <span class=\"k\">struct<\/span> <span class=\"n\">sockaddr<\/span><span class=\"o\">*<\/span> <span class=\"n\">address<\/span><span class=\"p\">,<\/span>\r\n                            <span class=\"kt\">int<\/span> <span class=\"n\">addrlen<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u8fde\u63a5\u5b8c\u6210\u4e4b\u524d\u53ef\u4ee5\u5411\u8f93\u51fa\u7f13\u51b2\u533a\u6dfb\u52a0\u6570\u636e\u3002\u5982\u679c\u8fde\u63a5\u6210\u529f\u542f\u52a8\uff0c\u51fd\u6570\u8fd4\u56de0\uff1b\u5982\u679c\u53d1\u751f\u9519\u8bef\u5219\u8fd4\u56de-1\u3002<\/p>\n<p>\u91ca\u653ebufferevent<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">void<\/span> <span class=\"nf\">bufferevent_free<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bev<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u91ca\u653ebufferevent\uff0cbufferevent\u5185\u90e8\u5177\u6709\u5f15\u7528\u8ba1\u6570\u3002\u5982\u679c\u91ca\u653e\u8fd8\u6709\u672a\u5904\u7406\u7684\u5ef6\u8fdf\u56de\u8c03\uff0c\u5219\u5728\u5b8c\u6210\u4e4b\u524dbufferevent\u4e0d\u4f1a\u88ab\u5220\u9664\u3002<\/p>\n<p>\u64cd\u4f5c\u56de\u8c03\uff1a<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"k\">typedef<\/span> <span class=\"nf\">void<\/span> <span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">bufferevent_data_cb<\/span><span class=\"p\">)(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bev<\/span><span class=\"p\">,<\/span>\r\n                                    <span class=\"kt\">void<\/span> <span class=\"o\">*<\/span><span class=\"n\">ctx<\/span><span class=\"p\">);<\/span>\r\n<span class=\"k\">typedef<\/span> <span class=\"nf\">void<\/span> <span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">bufferevent_event_cb<\/span><span class=\"p\">)(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bev<\/span><span class=\"p\">,<\/span>\r\n                                    <span class=\"kt\">short<\/span> <span class=\"n\">events<\/span><span class=\"p\">,<\/span>\r\n                                    <span class=\"kt\">void<\/span> <span class=\"o\">*<\/span><span class=\"n\">ctx<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/\u8bbe\u7f6e\u4e00\u4e2a\u6216\u8005\u591a\u4e2a\u56de\u8c03\u51fd\u6570\uff0c\u5206\u522b\u8868\u793a\u5728\u5df2\u7ecf\u8bfb\u53d6\u8db3\u591f\u7684\u6570\u636e\uff0c\u5df2\u7ecf\u5199\u5165\u8db3\u591f\u7684\u6570\u636e\u6216\u8005\u53d1\u751f\u9519\u8bef\u65f6\u8c03\u7528\uff0c\u7981\u7528\u56de\u8c03\uff0c\u53c2\u6570\u9700\u8981\u8bbe\u7f6e\u4e3aNULL\r\n<\/span><span class=\"kt\">void<\/span> <span class=\"nf\">bufferevent_setcb<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span>\r\n                       <span class=\"n\">bufferevent_data_cb<\/span> <span class=\"n\">readcb<\/span><span class=\"p\">,<\/span>\r\n                       <span class=\"n\">bufferevent_data_cb<\/span> <span class=\"n\">writecb<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"n\">bufferevent_event_cb<\/span> <span class=\"n\">eventcb<\/span><span class=\"p\">,<\/span><span class=\"kt\">void<\/span><span class=\"o\">*<\/span> <span class=\"n\">cbargs<\/span><span class=\"p\">);<\/span>\r\n<span class=\"c1\">\/\/\u83b7\u53d6bufferevent \u7684\u56de\u8c03\u51fd\u6570\r\n<\/span><span class=\"kt\">void<\/span> <span class=\"n\">bufferevent_getcb<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"n\">bufferevent_data_cb<\/span> <span class=\"o\">*<\/span><span class=\"n\">readcb_ptr<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"n\">bufferevent_data_cb<\/span> <span class=\"o\">*<\/span><span class=\"n\">writecb_ptr<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"n\">bufferevent_event_cb<\/span><span class=\"p\">,<\/span><span class=\"o\">*<\/span><span class=\"n\">event_ptr<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"kt\">void<\/span> <span class=\"o\">**<\/span><span class=\"n\">cbarg_ptr<\/span><span class=\"p\">)<\/span><\/code><\/pre>\n<\/div>\n<p>\u542f\u7528\u548c\u7981\u7528\u4e8b\u4ef6\uff1a<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">void<\/span> <span class=\"nf\">bufferevent_enable<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span><span class=\"kt\">short<\/span> <span class=\"n\">events<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kt\">void<\/span> <span class=\"nf\">bufferevent_disable<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span><span class=\"kt\">short<\/span> <span class=\"n\">events<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kt\">short<\/span> <span class=\"nf\">bufferevent_get_enabled<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u542f\u7528\u6216\u8005\u7981\u7528bufferevent\u4e0a\u7684EV_READ,EV_WRITE\u6216\u8005EV_READ|EV_WRITE\u4e8b\u4ef6\u3002\u6ca1\u6709\u542f\u7528\u8bfb\u53d6\u6216\u8005\u5199\u5165\u4e8b\u4ef6\u65f6bufferevent\u5c06\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u7684\u8bfb\u53d6\u6216\u8005\u5199\u5165\uff0c\u4f7f\u7528bufferevent_get_enabled()\u83b7\u53d6bufferevent\u4e0a\u5f53\u524d\u542f\u7528\u7684\u6570\u636e\u3002<\/p>\n<p>\u8bbe\u7f6e\u6c34\u4f4d\uff1a<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">void<\/span> <span class=\"nf\">bufferevent_setwatermark<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span>\r\n                             <span class=\"kt\">short<\/span> <span class=\"n\">events<\/span><span class=\"p\">,<\/span>\r\n                             <span class=\"n\">size_t<\/span> <span class=\"n\">lowmark<\/span><span class=\"p\">,<\/span>\r\n                             <span class=\"n\">size_t<\/span> <span class=\"n\">highmark<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u8bbe\u7f6e\u5355\u4e2abufferevent\u7684\u8bfb\u53d6\u6c34\u4f4d\uff0c\u5199\u5165\u6c34\u4f4d\u6216\u8005\u540c\u65f6\u8c03\u6574\u4e8c\u8005\u3002\u5bf9\u4e8e\u9ad8\u6c34\u4f4d\uff0c0\u8868\u793a\u65e0\u9650\u3002<\/p>\n<p>\u901a\u8fc7buffer\u5f97\u5230evbuffer<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span> <span class=\"o\">*<\/span><span class=\"nf\">bufferevent_get_input<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span><span class=\"o\">*<\/span> <span class=\"n\">bufev<\/span><span class=\"p\">);<\/span>\r\n<span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span> <span class=\"o\">*<\/span><span class=\"nf\">bufferevent_get_output<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span><span class=\"o\">*<\/span> <span class=\"n\">bufev<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u5206\u522b\u8fd4\u56de\u8f93\u5165\u7f13\u51b2\u533a\u548c\u8f93\u51fa\u7f13\u51b2\u533a\u3002<\/p>\n<p>\u5411bufferevent\u7684\u8f93\u51fa\u7f13\u51b2\u533a\u6dfb\u52a0\u6570\u636e<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">bufferevent_write<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"k\">const<\/span> <span class=\"kt\">void<\/span> <span class=\"o\">*<\/span><span class=\"n\">data<\/span><span class=\"p\">,<\/span>\r\n                     <span class=\"n\">size_t<\/span> <span class=\"n\">size<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kt\">int<\/span> <span class=\"n\">bufferevent_write_buffer<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span>\r\n                             <span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span> <span class=\"o\">*<\/span><span class=\"n\">buf<\/span><span class=\"p\">)<\/span><\/code><\/pre>\n<\/div>\n<p>bufferevent_write\u5c06\u5185\u5b58\u4e2d\u4ecedata\u5904\u5f00\u59cb\u7684size\u5b57\u8282\u6570\u636e\u6dfb\u52a0\u5230\u8f93\u51fa\u7f13\u51b2\u533a\u7684\u672b\u5c3e\uff0cbuffereevent_write_buffer()\u79fb\u9664buf\u7684\u6240\u6709\u5185\u5bb9\uff0c\u5c06\u5176\u653e\u7f6e\u5230\u8f93\u51fa\u7f13\u51b2\u533a\u7684\u672b\u5c3e\u3002\u51fd\u6570\u6267\u884c\u6210\u529f\u8fd4\u56de0\uff0c\u53d1\u751f\u9519\u8bef\u65f6\u8fd4\u56de-1\u3002<\/p>\n<p>\u4ecebufferevent\u8bfb\u53d6\u6570\u636e<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"n\">size_t<\/span> <span class=\"nf\">bufferevent_read<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span>\r\n                        <span class=\"kt\">void<\/span><span class=\"o\">*<\/span> <span class=\"n\">data<\/span><span class=\"p\">,<\/span><span class=\"n\">size_t<\/span> <span class=\"n\">size<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kt\">int<\/span> <span class=\"nf\">bufferevent_read_buffer<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span>\r\n                           <span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span> <span class=\"o\">*<\/span><span class=\"n\">buf<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u8bfb\u53d6bufferevent\u4e2d\u7684\u4e0a\u8f93\u5165\u7f13\u51b2\u533a\u5185\u5bb9\u3002bufferevent_read()\u81f3\u591a\u8bfb\u53d6size\u5b57\u8282\u7684\u6570\u636e\u5230\u5185\u5b58data\u4e2d\uff0c\u51fd\u6570\u6267\u884c\u6210\u529f\u8fd4\u56de\u8bfb\u53d6\u7684\u5b57\u8282\u6570\uff1b\u800cbufferevent_read_buffer()\u5219\u8bfb\u53d6\u6240\u6709\u8f93\u5165\u7f13\u51b2\u533a\u7684\u6570\u636e\uff0c\u51fd\u6570\u6267\u884c\u6210\u529f\u8fd4\u56de0\uff0c\u5931\u8d25\u8fd4\u56de-1.<\/p>\n<p>bufferevent\u7684\u6e05\u7a7a<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">bufferevent_flush<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">bufferevent<\/span> <span class=\"o\">*<\/span><span class=\"n\">bufev<\/span><span class=\"p\">,<\/span>\r\n                     <span class=\"kt\">short<\/span> <span class=\"n\">iotype<\/span><span class=\"p\">,<\/span>\r\n                     <span class=\"k\">enum<\/span> <span class=\"n\">bufferevent_flush_mode<\/span> <span class=\"n\">state<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>iotype \u53ef\u4ee5\u662fEV_READ,EV_WRITE\u6216\u8005EV_READ | EV_WRITE;<\/p>\n<p>state\u53ef\u4ee5\u662fBEV_NORMAL,BEV_FLUSH,BEV_FINISHED<\/p>\n<h3>\u6570\u636eevbuffer<\/h3>\n<p>libevent\u7684evbuffer\u5b9e\u73b0\u4e86\u4e3a\u5411\u540e\u9762\u6dfb\u52a0\u6570\u636e\u548c\u4ece\u524d\u9762\u79fb\u9664\u6570\u636e\u800c\u4f18\u5316\u7684\u5b57\u8282\u5bf9\u4e86\uff0cevbuffer\u7528\u4e8e\u5904\u7406\u7f13\u51b2\u7f51\u7edcIO\u7684&#8221;\u7f13\u51b2&#8221;\u90e8\u5206\u3002<\/p>\n<p>\u521b\u5efa\u548c\u91ca\u653e<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span> <span class=\"o\">*<\/span><span class=\"nf\">evbuffer_new<\/span><span class=\"p\">(<\/span><span class=\"kt\">void<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kt\">void<\/span> <span class=\"nf\">evbuffer_free<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span> <span class=\"o\">*<\/span><span class=\"n\">buf<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>evbuffer_new()\u5206\u914d\u548c\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684evbuffer,evbuffer_free()\u91ca\u653eevbuffer\u548c\u5176\u5185\u5bb9\u3002<\/p>\n<p>\u7ebf\u7a0b\u5b89\u5168\u7684\u8bbe\u7f6e<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-c\"><span class=\"kt\">int<\/span> <span class=\"nf\">evbuffer_enable_locking<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">buf<\/span><span class=\"p\">,<\/span><span class=\"kt\">void<\/span> <span class=\"o\">*<\/span><span class=\"n\">lock<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kt\">void<\/span> <span class=\"nf\">evbuffer_lock<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span> <span class=\"o\">*<\/span><span class=\"n\">buf<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kt\">void<\/span> <span class=\"nf\">evbuffer_unlock<\/span><span class=\"p\">(<\/span><span class=\"k\">struct<\/span> <span class=\"n\">evbuffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">buf<\/span><span class=\"p\">);<\/span><\/code><\/pre>\n<\/div>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0bevbuffer\u662f\u7ebf\u7a0b\u4e0d\u5b89\u5168\u7684\u3002\u5982\u679c\u5728evbuffer_enable_lock()\u4e2d\u7684lock\u4e3aNULL,\u90a3\u4e48\u5c31\u4f1aevthread_set_lock_creation_callback \u63d0\u4f9b\u7684\u9501\u521b\u5efa\u51fd\u6570\u521b\u5efa\u4e00\u4e2a\u9501\uff0c\u8d1f\u8d23libevent\u5c06\u4f7f\u7528lock\u9501\u3002evbuffer_lock()\u548c evbuffer_unlock()\u51fd\u6570\u5206\u522b\u8bf7\u6c42\u548c\u91ca\u653e evbuffer \u4e0a\u7684\u9501\u3002<\/p>\n<\/div>\n<\/div>\n<div class=\"ContentItem-time\">\u53d1\u5e03\u4e8e 08-04<\/div>\n<div class=\"Post-topicsAndReviewer\">\n<div class=\"TopicList Post-Topics\">\n<div class=\"Tag Topic\" data-za-detail-view-path-module=\"TopicItem\" data-za-extra-module=\"{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Topic&quot;,&quot;token&quot;:&quot;19893638&quot;}}}\">\n<div class=\"Popover\">\n<div id=\"Popover2-toggle\" aria-haspopup=\"true\" aria-expanded=\"false\" aria-owns=\"Popover2-content\">Libevent<\/div>\n<\/div>\n<\/div>\n<div class=\"Tag Topic\" data-za-detail-view-path-module=\"TopicItem\" data-za-extra-module=\"{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Topic&quot;,&quot;token&quot;:&quot;19616380&quot;}}}\">\n<div class=\"Popover\">\n<div id=\"Popover3-toggle\" aria-haspopup=\"true\" aria-expanded=\"false\" aria-owns=\"Popover3-content\">\u9ad8\u6027\u80fd<\/div>\n<\/div>\n<\/div>\n<div class=\"Tag Topic\" data-za-detail-view-path-module=\"TopicItem\" data-za-extra-module=\"{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Topic&quot;,&quot;token&quot;:&quot;19554300&quot;}}}\">\n<div class=\"Popover\">\n<div id=\"Popover4-toggle\" aria-haspopup=\"true\" aria-expanded=\"false\" aria-owns=\"Popover4-content\">Linux<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div class=\"Sticky RichContent-actions is-bottom\">\n<div class=\"ContentItem-actions\" data-za-detail-view-path-module=\"BottomBar\" data-za-extra-module=\"{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Post&quot;,&quot;id&quot;:&quot;396257690&quot;}}}\"><button class=\"Button VoteButton VoteButton--up\" type=\"button\" aria-label=\"\u8d5e\u540c 1 \">\u200b\u8d5e\u540c 1<\/button><button class=\"Button VoteButton VoteButton--down\" type=\"button\" aria-label=\"\u53cd\u5bf9\">\u200b<\/button><\/p>\n<div class=\"css-qbubgm\"><button class=\"Button BottomActions-CommentBtn Button--plain Button--withIcon Button--withLabel\" type=\"button\">\u200b\u6dfb\u52a0\u8bc4\u8bba<\/button><\/div>\n<div class=\"Popover ShareMenu\">\n<div id=\"Popover5-toggle\" class=\"ShareMenu-toggler\" aria-haspopup=\"true\" aria-expanded=\"false\" aria-owns=\"Popover5-content\"><button class=\"Button Button--plain Button--withIcon Button--withLabel\" type=\"button\">\u200b\u5206\u4eab<\/button><\/div>\n<\/div>\n<p><button class=\"Button ContentItem-action Button--plain Button--withIcon Button--withLabel\" type=\"button\">\u200b\u559c\u6b22<\/button><button class=\"Button ContentItem-action Button--plain Button--withIcon Button--withLabel\" type=\"button\">\u200b\u6536\u85cf<\/button><button class=\"Button ContentItem-action Button--plain Button--withIcon Button--withLabel\" type=\"button\">\u200b\u7533\u8bf7\u8f6c\u8f7d<\/button><\/p>\n<div class=\"Post-ActionMenuButton\">\n<div class=\"Popover\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u5730\u5740 Libevent\u7279\u70b9\uff1a \u4e8b\u4ef6\u9a71<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[118],"class_list":["post-5485","post","type-post","status-publish","format-standard","hentry","tag-02-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/5485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=5485"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/5485\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=5485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=5485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=5485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}