select 函数详解

select 函数详解Unix 系统下解释 函数原型 intselect intmaxfdp fd set readfds fd set writefds fd set errorfds structtimeva timeout select 函数的主要用途是什么 select 函数是一个监控函数 用来监控插口的状态 插口就是指的是文件描述符 Unix Linux 一切皆文件 select 函数能够监控插口状态 如下表 具体解释 select 的参数 先解释第五个参数 最后一个参数 st

Unix系统下解释:

头文件: #include 

函数原型:int select(int maxfdp, fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout);

select函数的主要用途是什么?select函数是一个监控函数,用来监控插口的状态!插口就是指的是文件描述符,Unix / Linux一切皆文件。

select函数能够监控插口状态,如下表:

select 函数详解

具体解释select的参数:

先解释第五个参数(最后一个参数):struct timeval  *timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态。

1、若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;

2、若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;

3、timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。

第一个参数: int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!

第二个参数: fd_set  *readfds 是指向 fd_set 结构的指针,这个集合中包括文件描述符,是要监视这些文件描述符的读变化的,即关心是否可以从这些文件中读取数据。

如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读(前提没有超时);

如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。

可以传入NULL值,表示不关心任何文件的读变化。

第三个参数: fd_set  *writefds是指向 fd_set 结构的指针,这个集合中包括文件描述符,是要监视这些文件描述符的写变化的,即关心是否可以向这些文件中写入数据。

如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写;

如果没有可写的文件,则根据timeout再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。

可以传入NULL值,表示不关心任何文件的写变化。

第四个参数: fe_set  *errorfds同上面两个参数的意图,用来监视文件错误异常。这个通常是:OOB同步标记未处理。

 

再说两个结构体:

第一:struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问,一个 socket 就是一个文件,socket句柄就是一个文件描述符。

fd_set 集合需要用一些宏来操作

FD_ZERO(fd_set*);       清空集合,相当于memset

FD_SET(int, fd_set*);     将一个给定的文件描述符加入集合之中

FD_CLR(int,   fd_set*);   将一个给定的文件描述符从集合中删除

FD_ISSET(int, fd_set*);  检查集合中指定的文件描述符是否可以读写

    第二:struct timeval 是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个毫秒数。

struct timeval{ long tv_sec; /*秒 */ long tv_usec; /*微秒 */ }

 

select函数返回值:

负值:select错误

0:等待超时,没有可读写或错误的文件

正值:有文件可读,或可写,或可读可写

 

在TCP网络编程中,常见的判断链路状态的代码如下:

一次判断

int ret = 0; int l_errno = 0; fd_set rfd, efd; struct timeval tv; FD_ZERO(&rfd); FD_ZERO(&efd); FD_SET(fd, &efd); FD_SET(fd, &rfd); tv.tv_sec = 3; tv.tv_usec = 0; ret = select(fd+1, &rfd, NULL, &efd, &tv); //这里不关心写,只关心读和异常状态 l_errno = errno; if(ret < 0) { DEBUG_MSG(" TCP link error %d errno %d \n", ret, l_errno); return -1; }

 

循环判断 

int ret = 0; int l_errno = 0; fd_set rfd, efd; struct timeval tv; while(1) { FD_ZERO(&rfd); FD_ZERO(&efd); FD_SET(fd, &efd); FD_SET(fd, &rfd); tv.tv_sec = 2; tv.tv_usec = 0; ret = select(fd+1, &rfd, NULL, &efd, &tv); //这里不关心写,只关心读和异常状态 l_errno = errno; switch(ret) { case -1: //异常,需要在下面进行返回判断处理 break; case 0: // 可能是超时 break; default: //正常状态,判断到有可读的文件,需要在下面判断返回 break; } //其他处理,确保跳出while循环 /* */ }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225789.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:32
下一篇 2026年3月17日 上午8:33


相关推荐

  • 服务器的文件不能修改器,荒野行动gg修改器脚本安装文件运行出错「建议收藏」

    服务器的文件不能修改器,荒野行动gg修改器脚本安装文件运行出错「建议收藏」PrivateDeclareFunctionCreateDirectoryLib”kernel32″Alias”CreateDirectoryA”(ByVallpPathNameAsString,lpSecurityAttributesAsSECURITY_ATTRIBUTES)AsLongPrivateTypeSECURITY_ATTRIBUTESnLengthAsLonglpSecurityD…

    2025年9月15日
    8
  • hexo博客搭建及主题优化(二)

    hexo博客搭建及主题优化(二)crystalBlog上篇hexo博客搭建及主题优化(一)主题优化二21.网站log设置主题目录下的_config.yml配置文件中:#配置网站favicon和网站LOGO##本地#favicon:/favicon.png#logo:/medias/logo.png#此处我用的CDN,也可以使用本地文件favicon:https://cdn.jsdelivr.net/gh/guixinchn/image/blog/favicon.pnglogo:https://cdn

    2026年1月30日
    6
  • 迅雷种子为什么php文件后缀,迅雷BT文件后缀是什么?[通俗易懂]

    迅雷种子为什么php文件后缀,迅雷BT文件后缀是什么?[通俗易懂]你是否正在寻找关于文件后缀的内容?让我把最实时的东西奉献给你:迅雷BT文件后缀是什么?BT是一个后缀名为.torrent的小文件,它里面保存了服务器地址、要下载的文件的大孝分成的块数以及各种下载参数设置,这个文件一般在20k-100k大小,可以把*.php直接改成*.torrent试试!要么就是文件制作出错!在去这个页面下载一次,当弹出迅雷下载的时候点取消.让Windows下载.会出现保存对话框…

    2025年8月11日
    7
  • Ubuntu下使用4g模块、4G模组上网,USB接口,图形界面

    Ubuntu下使用4g模块、4G模组上网,USB接口,图形界面Ubuntu下4g上网配置。一、接入网卡并查看。ms@ubuntu:~$l/dev/ttyU*/dev/ttyUSB0/dev/ttyUSB1/dev/ttyUSB2/dev/ttyUSB3ms@ubuntu:~$InterfaceDescription:InterfaceDescription DMInterface Diagnoseport NMEAInterface ForGPSNMEAmessageoutput ATI

    2025年6月23日
    5
  • 环境搭建 | Mac 环境变量配置

    环境搭建 | Mac 环境变量配置Mac环境变量配置mac一般使用bash作为默认shell,如果安装了ohmysh,则默认使用zshshell。Mac系统环境变量的加载顺序:/etc/profile/etc/paths~/.bash_profile~/.bash_login~/.profile~/.bashrc/etc/profile和/etc/paths是系统级别的,系统启动后就会…

    2022年6月17日
    26
  • datagrip mac 激活码_在线激活2022.02.16

    (datagrip mac 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~FZ…

    2022年4月1日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号