{"id":1732,"date":"2024-11-18T20:17:39","date_gmt":"2024-11-18T12:17:39","guid":{"rendered":"https:\/\/www.madbull.site\/?p=1732"},"modified":"2024-11-18T20:18:19","modified_gmt":"2024-11-18T12:18:19","slug":"libev%e7%9b%91%e5%90%acio%e4%ba%8b%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/www.madbull.site\/?p=1732","title":{"rendered":"libev\u76d1\u542cIO\u4e8b\u4ef6"},"content":{"rendered":"\n<p class=\"has-large-font-size\"><strong>\u4ecb\u7ecd<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>libev\u662f\u4e00\u4e2a\u9ad8\u6027\u80fd\u7684\u4e8b\u4ef6\u5faa\u73af\u5e93\uff0c\u7528\u4e8e\u7ba1\u7406\u5f02\u6b65\u4e8b\u4ef6\u3002\u5b83\u901a\u8fc7\u7ed9\u4e8b\u4ef6\u6ce8\u518c\u56de\u8c03\u51fd\u6570\u7684\u65b9\u5f0f\u5b9e\u73b0\u5e76\u53d1\uff0c\u65b9\u4fbf\u5f00\u53d1\u9ad8\u6548\u7684\u4e8b\u4ef6\u9a71\u52a8\u7a0b\u5e8f\u3002\u652f\u6301 epoll\u3001poll\u3001select\u3001kqueue\u3001port\u7b49\u591a\u79cd\u5b9e\u73b0\u673a\u5236\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>libev\u53ef\u4ee5\u5904\u7406\u4ee5\u4e0b\u4e8b\u4ef6\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I\/O \u4e8b\u4ef6 (ev_io)\uff1a\u76d1\u63a7\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e0a\u7684\u8bfb\u5199\u4e8b\u4ef6\u3002\u8fd9\u7c7b\u4e8b\u4ef6\u5e38\u7528\u4e8e\u7f51\u7edc\u7f16\u7a0b\uff0c\u76d1\u542csocket\u8fde\u63a5\u7684\u53ef\u8bfb\u6216\u53ef\u5199\u72b6\u6001\u3002<\/li>\n\n\n\n<li>\u5b9a\u65f6\u5668\u4e8b\u4ef6 (ev_timer)\uff1a\u5728\u6307\u5b9a\u7684\u65f6\u95f4\u95f4\u9694\u540e\u89e6\u53d1\u4e00\u6b21\u3002\u53ef\u4ee5\u7528\u6765\u5b9e\u73b0\u5ef6\u65f6\u64cd\u4f5c\u6216\u5468\u671f\u6027\u4efb\u52a1\u3002<\/li>\n\n\n\n<li>\u5468\u671f\u6027\u4e8b\u4ef6 (ev_periodic)\uff1a\u5728\u7279\u5b9a\u7684\u65f6\u95f4\u70b9\u89e6\u53d1\uff0c\u53ef\u4ee5\u7528\u6765\u5904\u7406\u66f4\u52a0\u590d\u6742\u7684\u5b9a\u65f6\u4efb\u52a1\uff0c\u6bd4\u5982\u6bcf\u5c0f\u65f6\u6216\u6bcf\u5929\u7684\u67d0\u4e2a\u56fa\u5b9a\u65f6\u95f4\u70b9\u89e6\u53d1\u3002<\/li>\n\n\n\n<li>\u4fe1\u53f7\u4e8b\u4ef6 (ev_signal)\uff1a\u5f53\u8fdb\u7a0b\u63a5\u6536\u5230\u7279\u5b9a\u7684\u4fe1\u53f7\u65f6\u89e6\u53d1\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u76d1\u542cSIGINT\uff08\u901a\u5e38\u662fCtrl+C\u4ea7\u751f\u7684\u4e2d\u65ad\u4fe1\u53f7\uff09\u6216SIGTERM\uff08\u8bf7\u6c42\u7ec8\u6b62\u8fdb\u7a0b\u7684\u4fe1\u53f7\uff09\u3002<\/li>\n\n\n\n<li>\u5b69\u5b50\u8fdb\u7a0b\u4e8b\u4ef6 (ev_child)\uff1a\u5f53\u5b50\u8fdb\u7a0b\u7684\u72b6\u6001\u53d1\u751f\u53d8\u5316\u65f6\u89e6\u53d1\uff0c\u6bd4\u5982\u5b50\u8fdb\u7a0b\u9000\u51fa\u6216\u505c\u6b62\u3002\u8fd9\u5bf9\u4e8e\u7ba1\u7406\u5b50\u8fdb\u7a0b\u975e\u5e38\u6709\u7528\u3002<\/li>\n\n\n\n<li>\u95f2\u7f6e\u4e8b\u4ef6 (ev_idle)\uff1a\u5f53\u4e8b\u4ef6\u5faa\u73af\u6ca1\u6709\u5176\u4ed6\u5f85\u5904\u7406\u7684\u4e8b\u4ef6\u65f6\u89e6\u53d1\u3002\u8fd9\u7c7b\u4e8b\u4ef6\u9002\u5408\u7528\u6765\u6267\u884c\u4f4e\u4f18\u5148\u7ea7\u7684\u4efb\u52a1\u3002<\/li>\n\n\n\n<li>\u5d4c\u5165\u5f0f\u4e8b\u4ef6 (ev_embed)\uff1a\u7528\u4e8e\u5d4c\u5165\u53e6\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\u3002\u8fd9\u79cd\u4e8b\u4ef6\u7c7b\u578b\u53ef\u4ee5\u7528\u6765\u5c06\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\u5d4c\u5165\u5230\u53e6\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\u4e2d\uff0c\u5b9e\u73b0\u66f4\u590d\u6742\u7684\u4e8b\u4ef6\u5904\u7406\u903b\u8f91\u3002<\/li>\n\n\n\n<li>\u7edf\u8ba1\u4e8b\u4ef6 (ev_stat)\uff1a\u76d1\u63a7\u6587\u4ef6\u7cfb\u7edf\u4e2d\u67d0\u4e2a\u6587\u4ef6\u7684\u72b6\u6001\u53d8\u5316\uff0c\u6bd4\u5982\u6587\u4ef6\u5927\u5c0f\u7684\u53d8\u5316\u3002\u8fd9\u53ef\u4ee5\u7528\u6765\u76d1\u63a7\u6587\u4ef6\u662f\u5426\u5b58\u5728\u6216\u5176\u5927\u5c0f\u662f\u5426\u6709\u6539\u53d8\u3002<\/li>\n<\/ul>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u6b64\u6b21\u7ed9\u51fa\u7684\u793a\u4f8b\u7ed9\u51fa\u7684\u662f I\/O \u4e8b\u4ef6 \u7684\u5e94\u7528\uff0c\u4ee5\u540e\u6709\u65f6\u95f4\u4e86\u628a\u5176\u4ed6\u4e8b\u4ef6\u7684\u5e94\u7528\u793a\u4f8b\u4e5f\u90fd\u6d4b\u8bd5\u7ed9\u51fa\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u793a\u4f8b<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u672c\u6b21\u793a\u4f8b\u662f\u4e00\u4e2a\u56de\u663e\u670d\u52a1\u5668\uff0c\u5ba2\u6237\u7aef\u7ed9\u670d\u52a1\u7aef\u53d1\u9001\u4ec0\u4e48\u6570\u636e\uff0c\u670d\u52a1\u7aef\u6309\u7167\u539f\u6837\u8fd4\u56de\u7ed9\u5ba2\u6237\u7aef\uff0c\u793a\u4f8b\u7684\u5b8c\u6574\u8fc7\u7a0b\u662f\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>1\u3001\u6253\u5f00\u4e00\u4e2asocket\u76d1\u542c\uff0c\u7ed1\u5b9a\u5728 0.0.0.0:3344 \u7aef\u53e3\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>2\u3001\u628a\u76d1\u542c\u5957\u63a5\u5b57\u7ed9 loop \u76d1\u542c\uff0c\u7b49\u5f85 connect \u4e8b\u4ef6\u53d1\u751f\u3002\u5bf9\u4e8e\u76d1\u542c\u5957\u63a5\u5b57\u6765\u8bf4\u5c31\u662f\u589e\u52a0 EV_READ \u4e8b\u4ef6\u76d1\u542c\uff0c\u4e5f\u5c31\u662f\u4f7f\u7528 ev_io_init \u65b9\u6cd5\u7ed9\u76d1\u542c\u5957\u63a5\u5b57\u589e\u52a0 EV_READ \u4e8b\u4ef6\u7684\u56de\u8c03\u51fd\u6570\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>3\u3001\u5728\u7b2c\u4e8c\u6b65\u7684\u56de\u8c03\u51fd\u6570\u91cc\uff0c\u901a\u8fc7accept\u65b9\u6cd5\uff0c\u83b7\u53d6\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\uff0c\u5bf9\u6b64\u5957\u63a5\u5b57\u6dfb\u52a0 EV_READ \u4e8b\u4ef6\u76d1\u542c\uff0c\u8fd9\u6837\u5728\u5ba2\u6237\u7aef\u53d1\u9001\u6570\u636e\u65f6\uff0c\u5c31\u4f1a\u88ab\u89e6\u53d1\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>4\u3001\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\u53d1\u751f EV_READ \u4e8b\u4ef6\u65f6\uff0c\u8c03\u7528\u56de\u8c03\u51fd\u6570\uff0c\u901a\u8fc7 read \u83b7\u53d6\u5230\u5ba2\u6237\u7aef\u53d1\u9001\u8fc7\u6765\u7684\u6570\u636e\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>5\u3001\u5bf9\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\u6dfb\u52a0 EV_WRITE \u4e8b\u4ef6\uff0c\u589e\u52a0\u56de\u8c03\u51fd\u6570\uff0c\u628a\u9700\u8981\u53d1\u9001\u7684\u6570\u636e\u901a\u8fc7 ev_io->data \u5b57\u6bb5\u4f20\u9012\u7ed9\u56de\u8c03\u51fd\u6570\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>6\u3001\u6dfb\u52a0\u5b8c EV_WRITE \u4e8b\u4ef6\u76d1\u542c\u540e\uff0c\u5728\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\u53ef\u5199\u7684\u65f6\u5019\uff08\u5b9e\u9645\u4e0a\u5927\u90e8\u5206\u65f6\u95f4\uff0c\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\u90fd\u662f\u53ef\u5199\u7684\uff09\u5c31\u4f1a\u8c03\u7528\u56de\u8c03\u51fd\u6570\uff0c\u5728\u56de\u8c03\u51fd\u6570\u91cc\uff0c\u628a\u6570\u636e\u53d1\u9001\u51fa\u53bb\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u4ee3\u7801tevio.c<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ gcc -Wall -o test tevio.c -lev\n\n#include &lt;ev.h>\n#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;string.h>\n#include &lt;unistd.h>\n#include &lt;sys\/socket.h>\n#include &lt;netinet\/in.h>\n#include &lt;arpa\/inet.h>\n\n\/***********************\n * \u5199\u4e8b\u4ef6\u7684\u56de\u8c03\u51fd\u6570\n ***********************\/\nvoid write_cb(EV_P_ ev_io *w, int revents) {\n    int fd = w->fd;   \/\/ \u5ba2\u6237\u7aef\u8fde\u63a5fd\n    char * buffer = (char *)w->data ;\n\n    if (revents &amp; EV_WRITE) {  \/\/ \u5199\u4e8b\u4ef6\n        ssize_t nwritten = write(fd, buffer, strlen(buffer));\n        if (nwritten &lt; 0) { \/\/ \u5199\u62a5\u9519\n            perror(\"write\");\n            close(fd);\n        } else {\n            printf(\"send data: %s\", buffer);\n        }\n        \/\/ \u505c\u6b62\u76d1\u542c\n        ev_io_stop(EV_A_ w);\n        \/\/ \u9500\u6bc1 data \u6307\u5411\u7684\u7a7a\u95f4\n        free(buffer) ;\n        \/\/ \u9500\u6bc1 ev_io \u6307\u5411\u7684\u7a7a\u95f4\n        free(w) ;\n    }\n}\n\n\/***********************\n * \u8bfb\u4e8b\u4ef6\u7684\u56de\u8c03\u51fd\u6570\n ***********************\/\nvoid read_cb(EV_P_ ev_io *w, int revents) {\n    int fd = w->fd;\n    char buffer&#91;24];\n    ssize_t nread;\n\n    if (revents &amp; EV_READ) {\n        nread = read(fd, buffer, sizeof(buffer) - 1);\n        if (nread > 0) {\n            buffer&#91;nread] = '\\0';\n            printf(\"recv data: %s\", buffer);\n\n            \/\/ \u521b\u5efa\u65b0\u7684 ev_io \u7ed3\u6784 watcher \u8bbe\u7f6e\u5199\u4e8b\u4ef6 \u76d1\u542c\n            \/\/ \u5f53\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\u53ef\u5199\u65f6\uff0c\u5c31\u4f1a\u7acb\u5373 \u53d1\u9001 \u6570\u636e\n            \/\/ \u5b9e\u9645\u4e0a\uff0c\u5ba2\u6237\u7aef\u5957\u63a5\u5b57\u7ecf\u5e38\u5904\u4e8e\u53ef\u5199\u72b6\u6001\n            ev_io *write_watcher = (ev_io *)malloc(sizeof(ev_io));\n            \/\/ \u628a\u6570\u636e\u7ed9\u5230 ev_io \u5199\u76d1\u542c\u4e8b\u4ef6\n            write_watcher->data = strdup(buffer) ;\n            \/\/ \u521d\u59cb\u5316\u5199\u4e8b\u4ef6\u76d1\u542c\n            ev_io_init(write_watcher, write_cb, fd, EV_WRITE);\n            ev_io_start(EV_A_ write_watcher);\n\n        } else if (nread == 0) { \/\/ \u65ad\u5f00\u8fde\u63a5\n            printf(\"Client disconnected\\n\");\n            \/\/ \u505c\u6b62\u4e8b\u4ef6\u76d1\u542c\n            ev_io_stop(EV_A_ w);\n            \/\/ \u5173\u95ed\u5957\u63a5\u5b57\n            close(fd);\n            \/\/ \u91ca\u653e\u7533\u8bf7\u7684 ev_io \u53e5\u67c4\u7a7a\u95f4\n            free(w);\n        } else {         \/\/ \u8bfb\u6570\u636e \u51fa\u9519\n            perror(\"read\");\n            \/\/ \u505c\u6b62\u4e8b\u4ef6\u76d1\u542c\n            ev_io_stop(EV_A_ w);\n            \/\/ \u5173\u95ed\u5957\u63a5\u5b57\n            close(fd);\n            \/\/ \u91ca\u653e\u7533\u8bf7\u7684 ev_io \u53e5\u67c4\u7a7a\u95f4\n            free(w);\n        }\n    }\n}\n\n\/***************************************\n * \u65b0\u8fde\u63a5\u7684\u56de\u8c03\u51fd\u6570\n * EV_P_ \u7684\u5b9a\u4e49\n * #define EV_P_ struct ev_loop *loop,\n * EV_A_ \u7684\u5b9a\u4e49\n * #define EV_A_ struct ev_loop *loop,\n ****************************************\/\nvoid accept_cb(EV_P_ ev_io *w, int revents) {\n\n    int listener_fd = w->fd;\n    struct sockaddr_in client_addr;\n    socklen_t client_len = sizeof(client_addr);\n    int client_fd;\n\n    \/\/ \u4e8b\u4ef6\u5206\u6790\n    if (revents &amp; EV_READ) {\n        \/\/ \u63a5\u6536\u8fde\u63a5\n        client_fd = accept(listener_fd, (struct sockaddr *)&amp;client_addr, &amp;client_len);\n        if (client_fd &lt; 0) {\n            perror(\"accept\");\n            return;\n        }\n        printf(\"New connection from %s:%d\\n\", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));\n\n        \/\/ \u5bf9\u8fde\u63a5\u7684\u5ba2\u6237\u7aef\u5957\u63a5\u5b57 client_fd \u589e\u52a0\u8bfb\u4e8b\u4ef6\u76d1\u542c\n        ev_io *client_watcher = (ev_io *)malloc(sizeof(ev_io));\n        \/\/ \u521d\u59cb\u5316\u8bfb\u4e8b\u4ef6\u76d1\u542c\n        ev_io_init(client_watcher, read_cb, client_fd, EV_READ);\n        \/\/ \u542f\u52a8\u4e8b\u4ef6\u76d1\u542c\n        ev_io_start(EV_A_ client_watcher);\n    }\n}\n\n\n\/************************************\n * \u5f00\u542f\u76d1\u542c\n * \u8fd4\u56de\u503c\uff1a\n *            -1 : \u521b\u5efa\u5931\u8d25\n *          >0 : \u76d1\u542c\u5957\u63a5\u5b57 fd\n *************************************\/\nint creat_listener() {\n\n    \/\/ \u521b\u5efa\u76d1\u542c\u5957\u63a5\u5b57\n    int listener_fd = socket(AF_INET, SOCK_STREAM, 0);\n    if (listener_fd &lt; 0) {\n        perror(\"socket\");\n        return -1 ;\n    }\n\n    \/\/ \u521b\u5efa\u76d1\u542c\u5730\u5740\n    struct sockaddr_in server_addr;\n    memset(&amp;server_addr, 0, sizeof(server_addr));\n    server_addr.sin_family = AF_INET;\n    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);\n    server_addr.sin_port = htons(3344);\n\n    \/\/ \u7ed1\u5b9a\u76d1\u542c\u5730\u5740\u548c\u7aef\u53e3\n    if (bind(listener_fd, (struct sockaddr *)&amp;server_addr, sizeof(server_addr)) &lt; 0) {\n        perror(\"bind\");\n        close(listener_fd);\n        return -1 ;\n    }\n\n    \/\/ \u542f\u52a8\u76d1\u542c\n    if (listen(listener_fd, SOMAXCONN) &lt; 0) {\n        perror(\"listen\");\n        close(listener_fd);\n        return -1 ;\n    }\n    \/\/ \u8fd4\u56de\u76d1\u542c\u6587\u4ef6\u63cf\u8ff0\u7b26\n    return listener_fd ;\n}\n\n\n\/\/ \u4e3b\u7a0b\u5e8f\nint main() {\n\n     \/\/ \u5f00\u542f\u76d1\u542c\n    int listener_fd = creat_listener() ;\n    if ( listener_fd &lt; 0 ) return -1 ;\n\n    \/\/ \u521d\u59cb\u5316 loop, \u6307\u5b9a\u4f7f\u7528 EPOLL \u6a21\u5f0f\u76d1\u542c\u4e8b\u4ef6\n    struct ev_loop *loop = ev_default_loop(EVBACKEND_EPOLL);\n\n    \/\/ \u521b\u5efa ev_io watcher \u76d1\u542c\u8fde\u63a5\u8bf7\u6c42\n    ev_io accept_watcher;\n\n    \/\/ \u521d\u59cb\u5316\u8fde\u63a5\u4e8b\u4ef6\u76d1\u542c\n    ev_io_init(&amp;accept_watcher, accept_cb, listener_fd, EV_READ);\n    \/\/ \u542f\u52a8\u76d1\u542c\u8fde\u63a5\u4e8b\u4ef6\n    ev_io_start(loop, &amp;accept_watcher);\n\n    \/\/ \u8fd0\u884c\u4e8b\u4ef6\u5faa\u73af\n    printf(\"Server started, listening on port 3344\\n\");\n\n    \/\/ \u542f\u52a8\u4e8b\u4ef6\u76d1\u542c loop \n    ev_run(loop, 0);\n\n    \/\/ \u6e05\u7406 \u76d1\u542c\u4e8b\u4ef6\n    ev_io_stop(loop, &amp;accept_watcher);\n    \/\/ \u5173\u95ed\u76d1\u542c\u5957\u63a5\u5b57\n    close(listener_fd);\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u7f16\u8bd1\u6d4b\u8bd5<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"983\" height=\"407\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/11\/1731928397358.png\" alt=\"\" class=\"wp-image-1733\" srcset=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/11\/1731928397358.png 983w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/11\/1731928397358-300x124.png 300w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/11\/1731928397358-768x318.png 768w\" sizes=\"auto, (max-width: 983px) 100vw, 983px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>libev\u662f\u4e00\u4e2a\u9ad8\u6027\u80fd\u7684\u4e8b\u4ef6\u5faa\u73af\u5e93\uff0c\u7528\u4e8e\u7ba1\u7406\u5f02\u6b65\u4e8b\u4ef6\u3002\u5b83\u901a\u8fc7\u7ed9\u4e8b\u4ef6\u6ce8\u518c\u56de\u8c03\u51fd\u6570\u7684\u65b9\u5f0f\u5b9e\u73b0\u5e76\u53d1\uff0c\u65b9\u4fbf\u5f00\u53d1\u9ad8\u6548\u7684\u4e8b\u4ef6\u9a71\u52a8\u7a0b\u5e8f\u3002\u652f\u6301 epoll\u3001poll\u3001select\u3001kqueue\u3001port\u7b49\u591a\u79cd\u5b9e\u73b0\u673a\u5236\u3002<\/p>\n<p>libev\u53ef\u4ee5\u5904\u7406\u4ee5\u4e0b\u4e8b\u4ef6\uff1a<\/p>\n<p>I\/O \u4e8b\u4ef6 (ev_io)\uff1a\u76d1\u63a7\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e0a\u7684\u8bfb\u5199\u4e8b\u4ef6\u3002\u8fd9\u7c7b\u4e8b\u4ef6\u5e38\u7528\u4e8e\u7f51\u7edc\u7f16\u7a0b\uff0c\u76d1\u542csocket\u8fde\u63a5\u7684\u53ef\u8bfb\u6216\u53ef\u5199\u72b6\u6001\u3002<br \/>\n\u5b9a\u65f6\u5668\u4e8b\u4ef6 (ev_timer)\uff1a\u5728\u6307\u5b9a\u7684\u65f6\u95f4\u95f4\u9694\u540e\u89e6\u53d1\u4e00\u6b21\u3002\u53ef\u4ee5\u7528\u6765\u5b9e\u73b0\u5ef6\u65f6\u64cd\u4f5c\u6216\u5468\u671f\u6027\u4efb\u52a1\u3002<br \/>\n\u5468\u671f\u6027\u4e8b\u4ef6 (ev_periodic)\uff1a\u5728\u7279\u5b9a\u7684\u65f6\u95f4\u70b9\u89e6\u53d1\uff0c\u53ef\u4ee5\u7528\u6765\u5904\u7406\u66f4\u52a0\u590d\u6742\u7684\u5b9a\u65f6\u4efb\u52a1\uff0c\u6bd4\u5982\u6bcf\u5c0f\u65f6\u6216\u6bcf\u5929\u7684\u67d0\u4e2a\u56fa\u5b9a\u65f6\u95f4\u70b9\u89e6\u53d1\u3002<br \/>\n\u4fe1\u53f7\u4e8b\u4ef6 (ev_signal)\uff1a\u5f53\u8fdb\u7a0b\u63a5\u6536\u5230\u7279\u5b9a\u7684\u4fe1\u53f7\u65f6\u89e6\u53d1\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u76d1\u542cSIGINT\uff08\u901a\u5e38\u662fCtrl+C\u4ea7\u751f\u7684\u4e2d\u65ad\u4fe1\u53f7\uff09\u6216SIGTERM\uff08\u8bf7\u6c42\u7ec8\u6b62\u8fdb\u7a0b\u7684\u4fe1\u53f7\uff09\u3002<br \/>\n\u5b69\u5b50\u8fdb\u7a0b\u4e8b\u4ef6 (ev_child)\uff1a\u5f53\u5b50\u8fdb\u7a0b\u7684\u72b6\u6001\u53d1\u751f\u53d8\u5316\u65f6\u89e6\u53d1\uff0c\u6bd4\u5982\u5b50\u8fdb\u7a0b\u9000\u51fa\u6216\u505c\u6b62\u3002\u8fd9\u5bf9\u4e8e\u7ba1\u7406\u5b50\u8fdb\u7a0b\u975e\u5e38\u6709\u7528\u3002<br \/>\n\u95f2\u7f6e\u4e8b\u4ef6 (ev_idle)\uff1a\u5f53\u4e8b\u4ef6\u5faa\u73af\u6ca1\u6709\u5176\u4ed6\u5f85\u5904\u7406\u7684\u4e8b\u4ef6\u65f6\u89e6\u53d1\u3002\u8fd9\u7c7b\u4e8b\u4ef6\u9002\u5408\u7528\u6765\u6267\u884c\u4f4e\u4f18\u5148\u7ea7\u7684\u4efb\u52a1\u3002<br \/>\n\u5d4c\u5165\u5f0f\u4e8b\u4ef6 (ev_embed)\uff1a\u7528\u4e8e\u5d4c\u5165\u53e6\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\u3002\u8fd9\u79cd\u4e8b\u4ef6\u7c7b\u578b\u53ef\u4ee5\u7528\u6765\u5c06\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\u5d4c\u5165\u5230\u53e6\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\u4e2d\uff0c\u5b9e\u73b0\u66f4\u590d\u6742\u7684\u4e8b\u4ef6\u5904\u7406\u903b\u8f91\u3002<br \/>\n\u7edf\u8ba1\u4e8b\u4ef6 (ev_stat)\uff1a\u76d1\u63a7\u6587\u4ef6\u7cfb\u7edf\u4e2d\u67d0\u4e2a\u6587\u4ef6\u7684\u72b6\u6001\u53d8\u5316\uff0c\u6bd4\u5982\u6587\u4ef6\u5927\u5c0f\u7684\u53d8\u5316\u3002\u8fd9\u53ef\u4ee5\u7528\u6765\u76d1\u63a7\u6587\u4ef6\u662f\u5426\u5b58\u5728\u6216\u5176\u5927\u5c0f\u662f\u5426\u6709\u6539\u53d8\u3002<\/p>\n","protected":false},"author":1,"featured_media":559,"comment_status":"open","ping_status":"open","sticky":false,"template":"single-with-sidebar","format":"standard","meta":{"footnotes":""},"categories":[156,154],"tags":[572,573,570,574,571,567,566,568],"class_list":["post-1732","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-c","category-154","tag-ev_io_init","tag-ev_io_start","tag-ev_read","tag-ev_run","tag-ev_write","tag-io","tag-libev","tag-568"],"_links":{"self":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1732","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1732"}],"version-history":[{"count":2,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1732\/revisions"}],"predecessor-version":[{"id":1735,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1732\/revisions\/1735"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/media\/559"}],"wp:attachment":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}