高級IO_多路轉接之Poll

文章目錄

  • 前言
  • 一、poll
  • 二、poll使用步驟
  • 總結


前言

上一章我們學習了select,但是select作為早期的多路轉接接口,缺點十分明顯,于是又出現poll和epoll等接口,今天我們就來學習一下poll的使用


提示:以下是本篇文章正文內容,下面案例可供參考

一、poll

在這里插入圖片描述
參數struct pollfd *fds,它其實傳的是一個struct pollfd數組,其結構體成員介紹如下。

  • fd設置為要關心的fd;
  • events是一個輸入型參數,用來告知poll要關心的事件,比如說POLLIN就是讓它關心讀事件;
  • revents是一個輸出型參數,當poll檢測到關心的fd有events的資源就緒時,就會返回并將該fd對應的revents設置為就緒events。

之前我們使用select,還需要用到一個輔助數組來保存我們需要關心的fds,因為它的大部分參數都是輸入輸出型參數。而poll采用了struct pollfd結構體的方式讓輸入輸出型參數分離互不影響,也是彌補了select的這一缺點。

參數nfds_t nfds,它用于告知poll需要關心的fd數量,其實就是fds數組的元素個數。

參數int timeout,功能上與select的timeout一樣,不過poll舍棄了傳struct timeval結構體的方式,直接傳一個int整形就可以了,其單位為ms。

二、poll使用步驟

poll的使用步驟與select類似。

#include "Socket.hpp"
#include <poll.h>#define MAX_POLLFDS 1024
#define INVALID_FD -1const std::string default_ip = "0.0.0.0";
const uint16_t default_port = 8080;class PollServer
{
public:PollServer(uint16_t port = default_port): _port(port) {}inline void InitFds(){_pollfds[0].fd = _listensock._sockfd;_pollfds[0].events = POLLIN;for (int i = 1; i < MAX_POLLFDS; ++i){_pollfds[i].fd = INVALID_FD;}}void Init(){_listensock.Init();_listensock.Bind(AF_INET, default_ip, _port);_listensock.Listen();InitFds();}void Print(){std::cout << "現有fds: ";for (int i = 0; i < MAX_POLLFDS; ++i){if (_pollfds[i].fd == INVALID_FD){continue;}std::cout << _pollfds[i].fd << " ";}std::cout << std::endl;}void Accepter(){struct sockaddr_in tmp;socklen_t len = sizeof tmp;int newfd = accept(_listensock._sockfd, (struct sockaddr *)&tmp, &len);for (int i = 0; i < MAX_POLLFDS; ++i){if (_pollfds[i].fd == INVALID_FD){_pollfds[i].fd = newfd;_pollfds[i].events = POLLIN;_pollfds[i].revents = 0;lg(Info, "Get A New Sockfd:%d", newfd);break;}if (i == MAX_POLLFDS){lg(Warning, "Fds Is Full, Newfd:%d Closed...", newfd);close(newfd);return;}}}void Handler(int fd, int i){char buffer[1024];memset(buffer, 0, sizeof buffer);int n = read(fd, buffer, sizeof buffer - 1);if (n > 0){buffer[n] = 0;std::string mes = buffer;std::cout << mes;_pollfds[i].revents = 0;}else if (n < 0){lg(Warning, "Read Error...");close(fd);_pollfds[i].fd = INVALID_FD;}else{lg(Info, "Foreign Host Closed...");close(fd);_pollfds[i].fd = INVALID_FD;}}void Dispatcher(){for (int i = 0; i < MAX_POLLFDS; ++i){if (_pollfds[i].fd == INVALID_FD){continue;}else if (_pollfds[i].revents & POLLIN){if (_pollfds[i].fd == _listensock._sockfd){// acceptAccepter();continue;}Handler(_pollfds[i].fd, i);}}}void Start(){while (1){Print();int n = poll(_pollfds, MAX_POLLFDS, 5000);if (n == 0){lg(Info, "Poll Time Out...");continue;}else if (n < 0){lg(Warning, "Poll Error...");std::cout << "errno:" << errno << " strerror:" << strerror(errno) << std::endl;}else{Dispatcher();}}}~PollServer(){_listensock.Close();}private:struct pollfd _pollfds[MAX_POLLFDS];Socket _listensock;uint16_t _port;
};

總結

poll相比較于select,彌補了兩個缺點。

  1. 不再需要繁瑣地更新需要關心的fd和其對應事件。
  2. 可關心的fd數量不再受其接口內置的數據結構大小限制,可以根據用戶需求自由調整。

但是仍然還有缺點,那就是每次進行一次poll都是一次從用戶態拷貝數據到內核態的過程。 還有還是需要一些for循環遍歷那些已經就緒了的fd。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39778.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

60種AI工具用法 學會探索AI的無限可能

外面還在賣的課程&#xff0c;學會探索AI的無限可能&#xff0c;從構建精準的提示詞到獲取個性化新聞&#xff0c;從快速制作PPT到短視頻內容的智能提煉&#xff0c;再到編程、股市分析和視頻剪輯&#xff0c;AI工具助您工作學習效率飛躍提升&#xff01; 百度網盤 請輸入提取…

2024 世界人工智能大會暨人工智能全球治理高級別會議全體會議在上海舉辦,推動智能向善造福全人類

2024 年 7 月 4 日&#xff0c;2024 世界人工智能大會暨人工智能全球治理高級別會議-全體會議在上海世博中心舉辦。聯合國以及各國政府代表、專業國際組織代表&#xff0c;全球知名專家、企業家、投資家 1000 余人參加了本次會議&#xff0c;圍繞“以共商促共享&#xff0c;以善…

【圖像分割】mask2former:通用的圖像分割模型詳解

最近看到幾個項目都用mask2former做圖像分割&#xff0c;雖然是1年前的論文&#xff0c;但是其attention的設計還是很有借鑒意義&#xff0c;同時&#xff0c;mask2former參考了detr的query設計&#xff0c;實現了語義和實例分割任務的統一。 1.背景 1.1 detr簡介 detr算是第…

基于github.com/emmansun/gmsm庫編寫的SM2對C 開放的庫

go-gmsm cgo庫 介紹 基于github.com/emmansun/gmsm庫編寫的SM2對C 開放的庫 特性&#xff1a;非對稱加密、不支持跨平臺編譯 git地址&#xff1a;https://gitee.com/state-secret-series/go-gmsm.git 軟件架構 Go、Cgo、mod 安裝教程 克隆倉庫 git clone https://gite…

香橙派AIpro實測:YOLOv8便捷檢測,算法速度與運行速度結合

香橙派AIpro實測&#xff1a;YOLOv8便捷檢測&#xff0c;算法速度與運行速度結合 文章目錄 香橙派AIpro實測&#xff1a;YOLOv8便捷檢測&#xff0c;算法速度與運行速度結合一、引言二、香橙派AIpro簡介三、YOLOv8檢測效果3.1 目標檢測算法介紹3.1.1 YOLO家族3.1.2 YOLOv8算法理…

NDT配準收斂問題

GitHub - abougouffa/ndtpso_slam: ROS package for NDT-PSO, a 2D Laser scan matching algorithm for SLAM SRG NDT Das_Arun_2013.pdf;jsessionid97F7EDB4E8805EFE68D1E46687EF593F (uwaterloo.ca)

上海計算機考研炸了,這所學校慎報!上海大學計算機考研考情分析!

上海大學&#xff08;Shanghai University&#xff09;&#xff0c;簡稱“上大”&#xff0c;是上海市屬、國家“211工程”重點建設的綜合性大學&#xff0c;教育部與上海市人民政府共建高校&#xff0c;國防科技工業局與上海市人民政府共建高校&#xff0c;國家“雙一流”世界…

【微信小程序開發】微信小程序界面彈窗,數據存儲相關操作代碼邏輯實現

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

ArcGIS Pro SDK (七)編輯 12 編輯模版

ArcGIS Pro SDK &#xff08;七&#xff09;編輯 12 編輯模版 文章目錄 ArcGIS Pro SDK &#xff08;七&#xff09;編輯 12 編輯模版1 在圖層上按名稱查找編輯模板2 查找屬于獨立表的表模板3 當前模板4 更改模板的默認編輯工具5 隱藏或顯示模板上的編輯工具6 使用圖層創建新模…

how to use Xcode

Xcode IDE概覽 Xcode 頁面主要分為以下四個部分&#xff1a; 工具欄&#xff08;ToolBar area&#xff09;&#xff1a;主要負責程序運行調試&#xff0c;編輯器功能區域的顯示 / 隱藏&#xff1b;編輯區&#xff08;Editor area&#xff09;&#xff1a;代碼編寫區域&#xf…

140. 好二叉樹(卡碼網周賽第二十四期(23年騰訊音樂筆試真題))

140. 好二叉樹&#xff08;卡碼網周賽第二十四期&#xff08;23年騰訊音樂筆試真題&#xff09;&#xff09; 題目描述 小紅定義一個二叉樹為“好二叉樹”&#xff0c;當且僅當該二叉樹所有節點的孩子數量為偶數(0 或者 2)。 小紅想知道&#xff0c;n&#xff08;1< n <…

vue table表格 ( parseTime-格式化時間)

<el-table-column label"發布時間" width"420px" prop"bidPublishDatetime"><template slot-scope"scope"><span>{{ parseTime(scope.row.bidPublishDatetime, {y}-{m}-{d}) }}</span></template></…

若依代碼生成

在若依框架中&#xff0c;以下是這些代碼的作用及它們在程序運行中的關聯方式&#xff1a; 1. domain.java&#xff1a;通常用于定義實體類&#xff0c;它描述了與數據庫表對應的對象結構&#xff0c;包含屬性和對應的訪問方法。作用是封裝數據&#xff0c;為數據的操作提供基…

Richtek立锜科技車規級器件選型

芯片按照應用場景&#xff0c;通常可以分為消費級、工業級、車規級和軍工級四個等級&#xff0c;其要求依次為軍工>車規>工業>消費。 所謂“車規級元器件”--即通過AEC-Q認證 汽車不同于消費級產品&#xff0c;會運行在戶外、高溫、高寒、潮濕等苛刻的環境&#xff0c…

澳藍榮耀時刻,6款產品入選2024年第一批《福州市名優產品目錄》

近日&#xff0c;福州市工業和信息化局公布2024年第一批《福州市名優產品目錄》&#xff0c;澳藍自主研發生產的直接蒸發冷卻空調、直接蒸發冷卻組合式空調機組、間接蒸發冷水機組、高效間接蒸發冷卻空調機、熱泵式熱回收型溶液調濕新風機組、防火濕簾6款產品成功入選。 以上新…

飛利浦的臺燈值得入手嗎?書客、松下多維度橫評大分享!

隨著生活品質的持續提升&#xff0c;人們對于健康的追求日益趨向精致與高端化。在這一潮流的推動下&#xff0c;護眼臺燈以其卓越的護眼功效與便捷的操作體驗&#xff0c;迅速在家電領域嶄露頭角&#xff0c;更成為了眾多家庭書房中不可或缺的視力守護者。這些臺燈以其精心設計…

(vue)eslint-plugin-vue版本問題 安裝axios時npm ERR! code ERESOLVE

(vue)eslint-plugin-vue版本問題 安裝axios時npm ERR! code ERESOLVE 解決方法&#xff1a;在命令后面加上 -legacy-peer-deps結果&#xff1a; 解決參考&#xff1a;https://blog.csdn.net/qq_43799531/article/details/131403987

【C語言】指針剖析(完結)

©作者:末央&#xff06; ©系列:C語言初階(適合小白入門) ©說明:以凡人之筆墨&#xff0c;書寫未來之大夢 目錄 回調函數概念回調函數的使用 - qsort函數 sizeof/strlen深度理解概念手腦并用1.sizeof-數組/指針專題2.strlen-數組/指針專題 指針面試題專題 回調函…

云服務器linux系統安裝配置docker

在我們拿到一個純凈的linux系統時&#xff0c;我需要進行一些基礎環境的配置 &#xff08;如果是云服務器可以用XShell遠程連接&#xff0c;如果連接不上可能是服務器沒開放22端口&#xff09; 下面是配置環境的步驟 sudo -s進入root權限&#xff1a;退出使用exit sudo -i進入…

process.env.VUE_APP_BASE_API

前端&#xff1a;process.env.VUE_APP_BASE_API 在Vue.js項目中&#xff0c;特別是使用Vue CLI進行配置的項目&#xff0c;process.env.VUE_APP_BASE_API 是一個環境變量的引用。Vue CLI允許開發者在不同環境下配置不同的環境變量&#xff0c;這對于管理API基礎路徑、切換開發…