select函数中参数nfds的理解

原创 2016年08月29日 20:43:17

函数原型  

#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;



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

select函数的第一个参数为什么是最大描述符加1呢

ChinaUnix.net 标题: 一直不明白,select函数的第一个参数为什么是最大描述符加1呢? [打印本页] 作者: iw1210    时间: 2013-01-23 18:51   ...

CASE WHEN 及 SELECT CASE WHEN的用法、SUM函数中的数字参数(转)

Case具有两种格式。简单Case函数和Case搜索函数。 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女'...

理解 select 函数并实现服务器端

运用select 函数是最具有代表性的实现复用服务器端方法。Windows平台下也有同名函数提供相同功能,因此具有良好的移植性。     select函数的功能和调用顺序     使用select...

select 和poll函数调用驱动的poll->poll_wait 理解

poll_wait不会挂起当前进程,而是把自己注册到某个事件等待队列中. poll_wait()是用在select系统调用中的.  一般你的代码会有一个struct file_operat...

javascript 中函数参数的理解

ECMASpcr

FD_SET Select函数使用

  • 2010-08-01 22:40
  • 68KB
  • 下载

More Effective C++----(12)理解"抛出一个异常"与"传递一个参数"或"调用一个虚函数"间的差异

Item M12:理解"抛出一个异常"与"传递一个参数"或"调用一个虚函数"间的差异 从语法上看,在函数里声明参数与在catch子句中声明参数几乎没有什么差别: class Widget {...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)