2#include3int4select(intmaxfdpl,fd_set*readset,fd_set*writeset,fd_set*exceptset,conststructtimeval*timeout);如何給readset,writeset,exceptset這3個參數中的每一個參數指定一個或多個描述符是一個設計上的問題" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

LINUX下FD_SET介紹

系統 4349 0

剛剛了解了linux下select系統調用,函數原型是

      
        1
      
       #include <sys/
      
        select
      
      .h>


      
        2
      
       #include <sys/time.h>


      
        3
      
      
        int
      
      
        4
      
      
        select
      
      (
      
        int
      
       maxfdpl, fd_set *readset, fd_set *writeset, fd_set *exceptset, 
      
        const
      
      
        struct
      
       timeval *timeout);
    

如何給readset, writeset, exceptset這3個參數中的每一個參數指定一個或多個描述符是一個設計上的問題。select使用描述符集,通常是一個整數數組,其中每一個整數中的每一位對應一個描述符。舉例來說,假設使用32位整數,那么該數組的第一個元素對應于描述符0-31,第二個元素對應于32-63,依此類推。隱藏在名為fd_set的數據類型和以下四個宏:

      
        1
      
      
        void
      
       FD_ZERO(fd_set *
      
        fdset);


      
      
        2
      
      
        void
      
       FD_SET(
      
        int
      
       fd, fd_set *
      
        fdset);


      
      
        3
      
      
        void
      
       FD_CLR(
      
        int
      
       fd, fd_set *
      
        fdset);


      
      
        4
      
      
        int
      
       FD_ISSET(
      
        int
      
       fd, fd_set *fdset); 
    

宏FD_SET設置文件描述符集fdset中對應于文件描述符fd的位(設置為 1),宏FD_CLR清除文件描述符集fdset中對應于文件描述符fd的位(設 置為0),宏FD_ZERO清除文件描述符集fdset中的所有位(即把所有位都 設置為0)。使用這3個宏在調用select前設置描述符屏蔽位。因為這3個描述符集參數是值-結果參數,在調用 select后,結果指示哪些描述符已就緒。使用FD_ISSET來檢測文件描述符集fdset中對應于文件描述符 fd的位是否被設置。描述符集內任何與未就緒描述符對應的位返回時均清成0,為此,每次重新調用select函數時,必須再次把所有描述符集內所關心的位置1.

通常,操作系統通過宏FD_SETSIZE來聲明在一個進程中select所能操作 的文件描述符的最大數目。許多系統實現有類似下面的聲明,取自4.4BSD的<sys/types.h>:

      
        1
      
      
        #ifndef FD_SETSIZE


      
      
        2
      
      
        #define
      
       FD_SETSIZE 256


      
        3
      
      
        #endif
      
    

不過,更新的源自BSD的內核和源自SVR4的內核把它放在頭文件<sys/select.h>中。

在linux下<sys/select.h>頭文件中,是這樣描述的:

      
        1
      
      
        /*
      
      
         Maximum number of file descriptors in `fd_set`. 
      
      
        */
      
      
        2
      
      
        #define
      
       FD_SETSIZE        _FD_SETSIZE
    

_FD_SETSIZE定義在/usr/include/linux下的posix_types.h中:

      
        1
      
      
        /*
      
      
        2
      
      
         *This macro may hava been defined in <gnu/types.h>. But we    always use the one here.


      
      
        3
      
      
        */
      
      
        4
      
      
        #undef
      
       _FD_SETSIZE


      
        5
      
      
        #define
      
       _FD_SETSIZE        1024
    

我們可以把FD_SETSIZE定義為某個更大的值以增加select所用描述符集的大小。不幸的是,這樣做通常行不通。因為select是在內核中實現的,并把內核的FD_SETSIZE定義為上限使用。因此,增大FD_SETSIZE還要重新編譯內核。值得注意的是,有些應用程序開始使用poll代替select,這樣可以避開描述符有限問題。另為,select的典型實現在描述符數增大時可能存在擴展性問題。

有些廠家正在將select的實現修改為允許進程將FD_SETSIZE定義為比默認值更大的某個值,例如BSD/OS。然而,從程序的可移植性考慮,不建議這樣使用。

?

LINUX下FD_SET介紹


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久99精品热在线观看15 | 久久免费视频8 | 亚洲精品欧美一区二区三区 | 午夜影院在线 | 四虎永久在线精品国产免费 | 日本黄色mv | 四虎影视国产884a精品亚洲 | 欧美精品一区二区三区在线 | 久久99热只有频精品6不卡 | 精品国产免费久久久久久 | 亚洲欧美不卡中文字幕 | 8090色| 久草热在线 | 欧美另类色 | 久久久久久久久久久观看 | 亚洲国产精品婷婷久久久久 | 精品小视频在线 | 91长腿女神清纯大又嫩在线 | 久草免费在线视频 | 曰本一级毛片免费播放 | 午夜伦y4480影院中文字幕 | 中文一级国产特级毛片视频 | 久久99国产精一区二区三区 | 91精品国产色综合久久不 | 国产精品自在线拍 | 精品久久久久久中文字幕专区 | 国产a久久精品一区二区三区 | 日韩在线观看网站 | 综合中文字幕 | 亚洲欧美日韩国产一区二区精品 | 狠狠色丁香婷婷久久综合2021 | 亚洲伊人色一综合网 | 2021天天干 | 欧美日韩国产在线观看 | 5g国产精品影院天天5g天天爽 | 亚州精品永久观看视频 | 一级毛片免费毛片一级毛片免费 | jzz欧美 | 四虎高清成人永久免费影院 | 色噜噜国产精品视频一区二区 | 琪琪色在线视频 |