linux要用select的原因是什么

使用select函數可以讓開發者同時等待多個文件緩沖區,從而減少IO等待時間,提高進程的IO效率。select()函數是IO多路復用的函數,允許程序監視多個文件描述符,等待所監視的一個或者多個文件描述符變為“準備好”的狀態;所謂的”準備好“狀態是指:文件描述符不再是阻塞狀態,可以用于某類IO操作了,包括可讀,可寫,發生異常三種。

#include頭文件中包含了select函數,該函數可在計算機中進行調用。該函數用于監視文件描述符的變化情況——讀寫或是異常。

1. select函數介紹

select函數是IO多路復用的函數,它主要的功能是用來等文件描述符中的事件是否就緒,select可以使我們在同時等待多個文件緩沖區 ,減少IO等待的時間,能夠提高進程的IO效率。

select()函數允許程序監視多個文件描述符,等待所監視的一個或者多個文件描述符變為“準備好”的狀態。所謂的”準備好“狀態是指:文件描述符不再是阻塞狀態,可以用于某類IO操作了,包括可讀,可寫,發生異常三種

2. select函數參數的介紹

???????int?select(int?nfds,?fd_set?*readfds,?fd_set?*writefds, ??????????????????fd_set?*exceptfds,?struct?timeval?*timeout);

ndfs

等待的文件描述符的最大值+1,例如:應用進程想要去等待文件描述符3,5,8的事件,則

nfds=max(3,5,8)+1;

fd_set類型

readfds和writefds,exceptfds的類型都是fd_set,那么fd_set類型是什么呢?

  • fd_set類型本質是一個位圖,位圖的位置 表示 相對應的文件描述符,內容表示該文件描述符是否有效,1代表該位置的文件描述符有效,0則表示該位置的文件描述符無效。

  • 如果將文件描述符2,3設置位圖當中,則位圖表示的是為1100。

  • fd_set的上限是1024個文件描述符。

readfds

  • readfds是 等待讀事件的文件描述符集合,.如果不關心讀事件(緩沖區有數據),則可以傳NULL值。

  • 應用進程和內核都可以設置readfds,應用進程設置readfds是為了通知內核去等待readfds中的文件描述符的讀事件.而 內核設置readfds是為了告訴應用進程哪些讀事件生效

linux要用select的原因是什么

writefds

與readfds類似,writefds是等待寫事件(緩沖區中是否有空間)的集合,如果不關心寫事件,則可以傳值NULL。

exceptfds

如果內核等待相應的文件描述符發生異常,則將失敗的文件描述符設置進exceptfds中,如果不關心錯誤事件,可以傳值NULL。

timeout

設置select在內核中阻塞的時間,如果想要設置為非阻塞,則設置為NULL。如果想讓select阻塞5秒,則將創建一個struct timeval time={5,0};

其中struct timeval的結構體類型是:

???????????struct?timeval?{ ???????????????long????tv_sec;?????????/*?seconds?*/ ???????????????long????tv_usec;????????/*?microseconds?*/ ???????????};

返回值

  • 如果沒有文件描述符就緒就返回0;

  • 如果調用失敗返回-1;

  • 如果timeout中中readfds中有事件發生,則返回timeout剩下的時間。

3.select的工作流程

應用進程內核都需要從readfds和writefds獲取信息,其中,內核需要從readfds和writefds知道哪些文件描述符需要等待,應用進程需要從readfds和writefds中知道哪些文件描述符的事件就緒.

linux要用select的原因是什么

如果我們要不斷輪詢等待文件描述符,則應用進程需要不斷的重新設置readfds和writefds,因為每一次調用select,內核會修改readfds和writefds,所以我們需要在 應用程序設置一個數組 來保存程序需要等待的文件描述符,保證調用 select 的時候readfds 和 writefds中的將如下:

linux要用select的原因是什么

4.Select服務器

如果是一個select服務器進程,則服務器進程會不斷的接收有新鏈接,每個鏈接對應一個文件描述符,如果想要我們的服務器能夠同時等待多個鏈接的數據的到來,我們監聽套接字listen_sock讀取新鏈接的時候,我們需要將新鏈接的文件描述符保存到read_arrys數組中,下次輪詢檢測的就會將新鏈接的文件描述符設置進readfds中,如果有鏈接關閉,則將相對應的文件描述符從read_arrys數組中拿走。

一張圖看懂select服務器:

linux要用select的原因是什么

簡易版的select服務器:

server.hpp文件:

#pragma?once??????????????????????????????????????????????????????????????????????????????????????????????????????????? ??#include<iostream>???? ??#include<sys>???? ??#include<sys>???? ??#include<netinet>???? ??#include<string.h>???? ??using?std::cout;???? ??using?std::endl;???? ??#define?BACKLOG?5???? ?????? ??namespace?sjp{???? ????class?server{???? ??????public:???? ??????static?int?Socket(){???? ????????int?sock=socket(AF_INET,SOCK_STREAM,0);???? ????????if(sock&gt;0)???? ????????return?sock;???? ????????if(sock????}???? ?????? ??????static?bool?Bind(int?sockfd,short?int?port){???? ????????struct?sockaddr_in?lock;???? ????????memset(&amp;lock,'

精品久久久久久中文字幕|
国产精品欧美亚洲韩国日本久久
|
伊人久久成人成综合网222|
日产久久强奸免费的看|
精品国产乱码久久久久久呢|
久久久国产精品亚洲一区|
国产精品久久久久久久久|
久久人人爽人人爽人人片AV东京热
|
久久久亚洲AV波多野结衣|
久久精品中文无码资源站|
久久综合综合久久狠狠狠97色88|
国产一区二区精品久久凹凸
|
久久99国产精品久久99小说|
99久久免费国产精品热|
色偷偷91久久综合噜噜噜噜|
久久国产亚洲高清观看|
狠狠色丁香久久婷婷综合图片|
久久99国产综合精品|
99久久做夜夜爱天天做精品|
99久久99久久精品国产片|
日韩av无码久久精品免费|
久久久久久久亚洲精品|
久久精品国产69国产精品亚洲|
国色天香久久久久久久小说|
久久精品国产亚洲5555|
国产成人无码久久久精品一|
久久久这里有精品|
日韩亚洲国产综合久久久|
一级做a爰片久久毛片人呢|
精品永久久福利一区二区|
国产精品久久婷婷六月丁香|
久久强奷乱码老熟女|
国内精品久久久久久久久|
久久国产精品-国产精品|
久久久女人与动物群交毛片|
日韩精品久久久久久久电影|
狠狠色丁香久久婷婷综合图片|
午夜肉伦伦影院久久精品免费看国产一区二区三区
|
亚洲国产小视频精品久久久三级
|
无码国内精品久久人妻|
久久久久亚洲AV成人网人人网站
|