<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 2.4 epoll API 2.4.1 創建EPOLL ```cpp /** * @param size 告訴內核監聽的數目 * * @returns 返回一個epoll句柄(即一個文件描述符) */ int epoll_create(int size); ``` ```cpp int epfd = epoll_create(1000); ``` ![](https://img.kancloud.cn/2c/7f/2c7f01f0a35c532df60ab2d79957c22d_390x209.png) 2.4.2 控制EPOLL ```cpp /** * @param epfd 用epoll_create所創建的epoll句柄 * @param op 表示對epoll監控描述符控制的動作 * * EPOLL_CTL_ADD(注冊新的fd到epfd) * EPOLL_CTL_MOD(修改已經注冊的fd的監聽事件) * EPOLL_CTL_DEL(epfd刪除一個fd) * * @param fd 需要監聽的文件描述符 * @param event 告訴內核需要監聽的事件 * * @returns 成功返回0,失敗返回-1, errno查看錯誤信息 */ int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); struct epoll_event { __uint32_t events; /* epoll 事件 */ epoll_data_t data; /* 用戶傳遞的數據 */ } /* * events : {EPOLLIN, EPOLLOUT, EPOLLPRI, EPOLLHUP, EPOLLET, EPOLLONESHOT} */ typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; ``` ```cpp struct epoll_event new_event; new_event.events = EPOLLIN | EPOLLOUT; new_event.data.fd = 5; epoll_ctl(epfd, EPOLL_CTL_ADD, 5, &new_event); ``` ![](https://img.kancloud.cn/c9/c5/c9c503da4b406d4944cdb01f6e2464e2_757x342.png) 2.4.3 等待EPOLL ```cpp /** * * @param epfd 用epoll_create所創建的epoll句柄 * @param event 從內核得到的事件集合 * @param maxevents 告知內核這個events有多大, * 注意: 值 不能大于創建epoll_create()時的size. * @param timeout 超時時間 * -1: 永久阻塞 * 0: 立即返回,非阻塞 * >0: 指定微秒 * * @returns 成功: 有多少文件描述符就緒,時間到時返回0 * 失敗: -1, errno 查看錯誤 */ int epoll_wait(int epfd, struct epoll_event *event, int maxevents, int timeout); ``` ```cpp struct epoll_event my_event[1000]; int event_cnt = epoll_wait(epfd, my_event, 1000, -1); ``` ![](https://img.kancloud.cn/e3/20/e320d522c4a14cd13ef573e7fec8acc6_756x418.png) 2.4.4 epoll編程框架 ```cpp //創建 epoll int epfd = epoll_crete(1000); //將 listen_fd 添加進 epoll 中 epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd,&listen_event); while (1) { //阻塞等待 epoll 中 的fd 觸發 int active_cnt = epoll_wait(epfd, events, 1000, -1); for (i = 0 ; i < active_cnt; i++) { if (evnets[i].data.fd == listen_fd) { //accept. 并且將新accept 的fd 加進epoll中. } else if (events[i].events & EPOLLIN) { //對此fd 進行讀操作 } else if (events[i].events & EPOLLOUT) { //對此fd 進行寫操作 } } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看