向来是一个比较懒惰的人,但是突然觉得应该整理一些东西,写写博客什么的。只是不知道从何处开始。昨天在看松本行弘的《代码的未来》中关于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之前,都应重新设置所要监控的描述符集合
请加微信,客服二维码请咨询购买,同时本程序源码配有系统运行视频 请联系客服索要视频文件

网址:毕设在线毕业设计网 http://www.bisheonline.net
服务范围:定制各类计算机程序设计,vue,jsp ,java 各类框架各类,开发工具 eclipse myeclipse idea vs 等,wap android ssm springboot asp.net php python (爬取,django,flask) vue node.js react ,winform uniapp小程序 等
E-mail: 251836457@qq.com
|