LINUX下FD_SET介绍

系统 3875 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条评论