select函数中参数nfds的理解

来源:互联网 发布:奥拉朱旺场均数据 编辑:程序博客网 时间:2024/05/16 01:49

函数原型  

#include <sys/time.h>

       #include <sys/types.h>

       #include <unistd.h>


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


       void FD_CLR(int fd, fd_set *set);
       int  FD_ISSET(int fd, fd_set *set);
       void FD_SET(int fd, fd_set *set);
       void FD_ZERO(fd_set *set);


       #include <sys/select.h>


       int pselect(int nfds, fd_set *readfds, fd_set *writefds,
                   fd_set *exceptfds, const struct timespec *timeout,

                   const sigset_t *sigmask);

这个参数看似很简单,是当前监听套接字的最大值+1

    其实这个nfds其实填进去的就是maxfd+1 , 而maxfd是当前监听信号的最大值,比如监听0(键盘) 及tcp通信中的套接字。一般是从3开始增长。

如果建立一个tcp通信模型, 创建一个服务器那么就会产生一个3号的套接字,相当于文件描述符。可以利用文件io进行读写操作。那么在利用select实现io多了复用时就会产生监听3这个套接字。因此此时的maxfd = 3 , 那么ndfs = maxfd + 1 = 4 ; 其实这个ndfs就像一个空间,或者位置,保存一个递增的数据。这个数字可以是tcp套接字也可以是文件描述符。

比如如果监听 3 , 4 , 5 , 6 , 7这5个文件描述符,或者套接字, 那么就需要8个位置,因为,文件描述符是从0开始的。  如果此时你将nfds置为8那么一切正常,1号位置么有内容, 知道4号位置 存放3 监听 , 5号位置存4    6号位置存5 , 7号位置存6 , 8号位置存7 。 切记不能因为这里只有5个需要监听的对象就将nfds = 5 , 如果置5 说明只有5个位置,但是nfds里面只能存放连续的监听对象(文件描述符)如果中间监听对象缺省,可以不坚听,但是位置一定要保留。所以对于以上的情况 nfds为最大的fd = 7 加上1 即maxfd = 7  nfds = maxfd+1 = 8;



0 0