日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux平台IO多路复用 select接口使用例子

發布時間:2025/4/5 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux平台IO多路复用 select接口使用例子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這幾天在學習net-snmp源碼,里面封裝了很多select函數調用,這里記錄一下linux上select的用法以及相關接口。

先看接口:

//頭文件 #include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h>/** 參數nfds表示監聽的描述符個數,通常等于最大的描述符加一,select最多同時監聽描述符* 數量有個上限,FD_SETSIZE(1024),不同平臺這個值可能不同,所以如果程序中監聽數量特別* 多的話,建議使用epoll。** 參數 readfds, writefds, exceptfds表示描述符集,可以把我們關心的描述符放到對應的* 描述符數組里面,這三個分別對應著可讀、可寫和異常事件。可以都設置為NULL,這時候select* 調用就相當于一個更精確的sleep。 ** 參數 timeout表示select超時時間,如果為NULL的話,表示永久阻塞,除非監聽的描述符集上* 有事件發生或者收到信號,為0的話,表示立即返回,其它的值則表示相應的等待時間。** 成功返回準備好讀寫的文件描述符數量,* 返回0表示超時,返回-1表示出錯。*/ int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);/* 從fdset中清空該文件描述符標志位 */ void FD_CLR(int fd, fd_set *set); /* 判斷該文件描述符上是否有事件發生 */ int FD_ISSET(int fd, fd_set *set);/* 將該文件描述符添加到fd_set數組中 */ void FD_SET(int fd, fd_set *set);/* 初始化fdset */ void FD_ZERO(fd_set *set);每次調用select后,都需要重新清空描述符集并重新添加感興趣的文件描述符。另外,select返回時會將 剩余時間填充到timeout參數中,因此重新調用select的時候也要重新初始化該時間參數。

示例,創建兩個udp套接字,使用select循環監聽可讀事件,注意收到事件處理完成后需要重新對fd_set描述符集進行初始化,

這一點不如epoll使用方便。

/*** Description : linux 環境 select接口使用示例* 創建兩個udp套接字,然后使用select監聽套接字上讀事件。 * Date : 20181001* Author : mason*/#include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <sys/errno.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <string.h>#define BUFFER_SIZE 512 #define log(fmt, arg...) printf("[udptest] %s:%d "fmt, __FUNCTION__, __LINE__, ##arg)void main() {int sock, sock2;int addr_len, recv_len;char buffer[BUFFER_SIZE] = {0};struct sockaddr_in addr, addr2;fd_set rfds;struct timeval tv;int retval, maxfdp1 = 0;/* 創建UDP套接字 */sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock == -1) {log("create socket fail \r\n");return ;} sock2 = socket(AF_INET, SOCK_DGRAM, 0);if (sock2 == -1) {log("create socket2 fail \r\n");close(sock);return ;} /* 設置監聽地址 */addr.sin_family = AF_INET;addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(40000);addr2.sin_family = AF_INET;addr2.sin_addr.s_addr = INADDR_ANY; addr2.sin_port = htons(30000);addr_len = sizeof(struct sockaddr_in);/* 綁定本地監聽地址 */if (0 != bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){log("bind local listening addr fail,errno : %d \r\n", errno);goto end;} if (0 != bind(sock2, (struct sockaddr *)&addr2, sizeof(struct sockaddr_in))){log("bind local listening addr fail,errno : %d \r\n", errno);goto end;} /* 初始化描述符集 */FD_ZERO(&rfds);/* 添加到描述符集里面 */FD_SET(sock, &rfds);maxfdp1 = maxfdp1 > sock ? (maxfdp1 + 1) : (sock + 1);/* 添加到描述符集里面 */FD_SET(sock2, &rfds);maxfdp1 = maxfdp1 > sock ? (maxfdp1 + 1) : (sock + 1);/* select超時10s */tv.tv_sec = 10;tv.tv_usec = 0;/* 循環監聽 */for (;;){/* 只監聽讀事件 */retval = select(maxfdp1, &rfds, NULL, NULL, &tv);if (retval > 0){/* 判斷是否可讀 */if (FD_ISSET(sock, &rfds)){recv_len = read(sock, buffer, sizeof(buffer));if (recv_len != -1){log("revc from sock : %s\r\n", buffer);memset(buffer, 0, sizeof(buffer));}}if (FD_ISSET(sock2, &rfds)){recv_len = read(sock2, buffer, sizeof(buffer));if (recv_len != -1){log("revc from sock2 : %s\r\n", buffer);memset(buffer, 0, sizeof(buffer));}}}else if (retval == 0){/* select 超時 */log("select timeout \r\n");}else{log("select error \r\n");}/* 清空標志位 */FD_ZERO(&rfds);/* 重新設置超時 */tv.tv_sec = 5;/* 重新添加到select監聽數組中 */FD_SET(sock, &rfds);FD_SET(sock2, &rfds);}end:close(sock);close(sock2);return; }

Makefile:

# # Linux 同步IO復用 select接口例子 #app:gcc -o select_demo select_demo.cclean:rm -rf *.o select_demo

運行截圖:

參考資料:

1. man select?http://www.man7.org/linux/man-pages/man2/select.2.html

2. 《UNIX網絡編程卷一 套接字API》第6章 IO多路復用

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的linux平台IO多路复用 select接口使用例子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩在线免费观看视频 | 国产成人精品一区二区在线小狼 | 中文在线字幕免 | 带aaa级的网名 | 17c国产精品 | 国产理论片 | 蜜桃臀aⅴ精品一区二区三区 | 性猛交xxxx乱大交孕妇2十 | 欧美午夜精品一区二区 | 无码aⅴ精品一区二区三区浪潮 | 欧美youjizz| 亚洲永久免费观看 | 黄色一级大片在线免费看国产 | 日本香蕉视频 | 无人码人妻一区二区三区免费 | www,色| 99视频国产精品免费观看a | 亚洲黄站 | 大地av| 久久精品韩国 | 香蕉色视频 | 亚洲中文字幕无码不卡电影 | 日韩毛片一区 | a毛片视频 | 色婷婷av一区二区三区软件 | 国产特级片| 亚洲精品国产精品乱码在线观看 | 午夜黄网| 久久大伊人 | 成人99视频 | 打屁股视频网站 | 中国肥胖女人真人毛片 | 在线观看国产麻豆 | 亚洲综合精品视频 | 成人动态视频 | 久久久久久久久久成人 | 色偷偷视频 | 久久国产乱 | 国产精品三级在线观看无码 | 大吊av| 91sao| 亚洲高清一区二区三区 | 国产三级播放 | 午夜免费福利小视频 | 天天插综合网 | xxxx黄色| 99久久亚洲精品日本无码 | 亚洲另类色综合网站 | 天天av天天 | 91美女网站 | 久久久久国产一区二区三区潘金莲 | 在线观看亚洲精品视频 | 亚洲无码高清精品 | 国产又粗又猛又爽又黄的视频一 | 亚洲天堂久久新 | 美女视频网址 | 婷婷资源网 | 网址在线观看你懂的 | 日韩 欧美 中文 | 久久精品色妇熟妇丰满人妻 | 毛毛毛片 | 亚洲av无码一区二区三区dv | 久久午夜神器 | 日韩无码精品一区二区 | 亚洲av成人精品毛片 | 国产精品午夜久久 | 日韩av一区在线播放 | 日本黄色大片网站 | 色无极亚洲 | 日本狠狠干 | 亚洲精品99久久久久中文字幕 | 五月天精品 | av大片免费观看 | 成人福利在线视频 | 国内精品久久久久久久久 | 午夜电影一区二区 | 久久97视频| 按摩毛片 | 久久久久久久久网站 | 韩国伦理av | 美丽的姑娘观看在线播放 | 91粉色视频 | 国产乱码一区二区三区播放 | 国产字幕av | 视频一区中文字幕 | 亚洲素人| 美女激情网 | 欧美有码视频 | 99热热热热 | 四虎永久免费 | 中文字幕乱码亚洲无线三区 | 在线免费观看日韩视频 | 久久久a级片 | 在线你懂 | 日韩欧美成人精品 | 中文字幕在线播放av | 精品三级 | 性按摩玩人妻hd中文字幕 | 三级不卡 |