欢迎来到 翰文编程!专业源码交易平台,海量精品源码任你挑选。
登录 免费注册 帮助中心 收藏本站
个人中心 我的订单
首页 > 行业资讯 > 关于select 函数

关于select 函数

行业资讯 来源:翰文编程 源码设计 定制服务 发布日期:2013-09-08 点击率:1
 向来是一个比较懒惰的人,但是突然觉得应该整理一些东西,写写博客什么的。只是不知道从何处开始。昨天在看松本行弘的《代码的未来》中关于C10K问题的分析,其中涉及到了slecet函数。select函数之前只是知道,没怎么了解。然后看了一下,整理如下:

应用场景:

在很多时候,一个进程要处理很多个文件的读写(包括socket文件),然后对于这些文件的访问经常会因为各种原因导致进程被阻塞。为了使进程不被阻塞在单个文件的访问上,可以使用select函数。首先将多个需要访问的文件描述符设置到相关的fd_set,并设置相应的超时时间,然后调用select函数当这些文件中,有文件可用或者超时时间已到后,select函数就会返回。

头文件:

#include <sys/select.h>

函数原型:

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

readfds为读文件描述符集的指针,用于监控哪些文件描述符处于可读状态,writefds为写文件描述符集的指针,exceptfds为异常的文件描述符集的指针,以上三个集合中,对于不需要监视的,可以设置为NULL。fd_set本质上是一个bit 数组。对于根据相应的文件描述符映射至相对应的位置。

timeout为超时时间,如果timeout中对应的秒数和微妙数设置为0,则select不会休眠,立即返回,如果timeout设置为NULL,则会一直休眠,直到有资源处于非阻塞状态(可读、可写或者有异常)。

需要注意的是linux中,每次调用select都会修改timeout值,因此每次调用都要重新设置timeout的值

nfds为readfds、writefds和exceptfds三者中描述符最大值加1.

返回值 为int型。如果为0,则超时返回。如果-1,则有错误,并设置errno,如果大于0,则代表处于可用状态的描述符的数量。

对于fd_set,对应有四个宏,用于进行相关的控制:

FD_ZERO(fd_set *fdset):清空fdset中的所有描述符。
FD_SET(int fd, fd_set *fdset):添加单个描述符至fdset中。
FD_CLR(int fd, fd_set *fdset):清楚fdset中某个描述符。
FD_ISSET(int fd, fd_set *fdset):检查某个描述符是否在fdset中。
值得注意的是:对于调用select返回后,如果想确定某个描述符是否在fdset中,需要使用FD_ISSET判断。由于调用可能会修改,因此每次调用select之前,都应重新设置所要监控的描述符集合
购买须知:请加客服微信咨询购买,本程序源码配有系统运行视频,请联系客服索要视频文件。
服务范围:定制各类计算机程序设计,vue、jsp、java 各类框架;开发工具 eclipse / myeclipse / idea / vs 等;wap、android、ssm、springboot、asp.net、php、python(爬虫、django、flask)、node.js、react、winform、uniapp 小程序等。
Q
客服 QQ
251836457
@
电子邮箱

需要源码或毕设帮助?

扫码添加客服微信,获取源码、演示、报价与一对一技术支持。

客服 顶部