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理解总结

select用途:在一段时间内,监听用户感兴趣的文件描述符上的可读可写和异常等时间。          对于select函数的接口:          int select(int nfds,fd...
  • hello_bravo_
  • hello_bravo_
  • 2016年07月15日 17:18
  • 382

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

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

I/O多路复用之select简介

系统提供select函数用来实现I/O多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件描述状态变化的。程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生状...
  • LF_2016
  • LF_2016
  • 2017年03月15日 22:54
  • 571

linux之select函数用法详解

select系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。   何为文件句...
  • qq_21792169
  • qq_21792169
  • 2016年01月03日 10:23
  • 14284

深入理解JavaScript函数参数(推荐)

js的函数很特变,懂得一下这些才能玩转js函数的奥妙。。 正文开始~ ---------------------------------------------------------------...
  • u012028371
  • u012028371
  • 2017年04月13日 09:57
  • 371

gluLookAt 函数详解

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,                                    GLdoubl...
  • wangqinghao
  • wangqinghao
  • 2013年11月01日 15:41
  • 22882

关于select中fd限制问题

关于select中fd限制问题 分类: 网络编程 C++2014-05-18 14:40 661人阅读 评论(0) 收藏 举报 select 是多路复用,或异步模型中经常用到的...
  • wangyin159
  • wangyin159
  • 2015年08月15日 15:17
  • 1018

sql深度理解——select

http://blog.jobbole.com/55086/ 1、 SQL 是一种声明式语言 首先要把这个概念记在脑中:“声明”。 SQL 语言是为计算机声明了一个你想从原...
  • jlx1986
  • jlx1986
  • 2017年01月04日 17:40
  • 536

Select函数实现原理分析

本文转自 http://blog.csdn.net/codejoker/article/details/5404442?locationNum=1 select 需要驱动程序的支持,驱动程序实现...
  • Programmer_acu
  • Programmer_acu
  • 2016年09月06日 10:09
  • 534

select函数使用浅析

一、函数原型及参数说明     int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct ...
  • silent123go
  • silent123go
  • 2016年09月18日 19:32
  • 1180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:select函数中参数nfds的理解
举报原因:
原因补充:

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