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

黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

LINUX下FD_SET介紹

系統(tǒng) 5260 0

剛剛了解了linux下select系統(tǒng)調(diào)用,函數(shù)原型是

      
        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個(gè)參數(shù)中的每一個(gè)參數(shù)指定一個(gè)或多個(gè)描述符是一個(gè)設(shè)計(jì)上的問題。select使用描述符集,通常是一個(gè)整數(shù)數(shù)組,其中每一個(gè)整數(shù)中的每一位對(duì)應(yīng)一個(gè)描述符。舉例來說,假設(shè)使用32位整數(shù),那么該數(shù)組的第一個(gè)元素對(duì)應(yīng)于描述符0-31,第二個(gè)元素對(duì)應(yīng)于32-63,依此類推。隱藏在名為fd_set的數(shù)據(jù)類型和以下四個(gè)宏:

      
        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設(shè)置文件描述符集fdset中對(duì)應(yīng)于文件描述符fd的位(設(shè)置為 1),宏FD_CLR清除文件描述符集fdset中對(duì)應(yīng)于文件描述符fd的位(設(shè) 置為0),宏FD_ZERO清除文件描述符集fdset中的所有位(即把所有位都 設(shè)置為0)。使用這3個(gè)宏在調(diào)用select前設(shè)置描述符屏蔽位。因?yàn)檫@3個(gè)描述符集參數(shù)是值-結(jié)果參數(shù),在調(diào)用 select后,結(jié)果指示哪些描述符已就緒。使用FD_ISSET來檢測文件描述符集fdset中對(duì)應(yīng)于文件描述符 fd的位是否被設(shè)置。描述符集內(nèi)任何與未就緒描述符對(duì)應(yīng)的位返回時(shí)均清成0,為此,每次重新調(diào)用select函數(shù)時(shí),必須再次把所有描述符集內(nèi)所關(guān)心的位置1.

通常,操作系統(tǒng)通過宏FD_SETSIZE來聲明在一個(gè)進(jìn)程中select所能操作 的文件描述符的最大數(shù)目。許多系統(tǒng)實(shí)現(xiàn)有類似下面的聲明,取自4.4BSD的<sys/types.h>:

      
        1
      
      
        #ifndef FD_SETSIZE


      
      
        2
      
      
        #define
      
       FD_SETSIZE 256


      
        3
      
      
        #endif
      
    

不過,更新的源自BSD的內(nèi)核和源自SVR4的內(nèi)核把它放在頭文件<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定義為某個(gè)更大的值以增加select所用描述符集的大小。不幸的是,這樣做通常行不通。因?yàn)閟elect是在內(nèi)核中實(shí)現(xiàn)的,并把內(nèi)核的FD_SETSIZE定義為上限使用。因此,增大FD_SETSIZE還要重新編譯內(nèi)核。值得注意的是,有些應(yīng)用程序開始使用poll代替select,這樣可以避開描述符有限問題。另為,select的典型實(shí)現(xiàn)在描述符數(shù)增大時(shí)可能存在擴(kuò)展性問題。

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

?

LINUX下FD_SET介紹


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論