加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:I/O多路转接(select、pselect和poll)

发布时间:2016-01-12 17:43:37 所属栏目:Unix 来源:网络整理
导读:I/O多路转接:先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数才返回。在返回时,它告诉进程哪些描述符已准

对fd_set数据类型可以进行的处理是:分配一个这种类型的变量;将这种类型的一个变量值赋予同类型的另一个变量;或对于这种类型的变量使用下列四个函数中的一个。

#include <sys/select.>  
int FD_ISSET(int fd,fd_set *fdset);//返回值:若fd在描述符集中则返回非0值,否则返回0  
void FD_CLR(int fd,fd_set *fdset);  
void FD_SET(int fd,fd_set *fdset);  
void FD_ZERO(fd_set *fdset);

调用FD_ZERO将一个指定的fd_set变量的所有位设置为0.

调用FD_SET设置一个fd_set变量的指定位。

调用FD_CLR则将一指定位清除。

调用FD_ISSET测试一指定位是否设置。

select的中间三个参数(指向描述符集的指针)中的任意一个或全部都可以是空指针,这表示对相应状态并不关心。如果所有三个指针都是空指针,则select提供了较sleep更精确的计时器。

select的第一个参数maxfdp1的意思是“最大描述符加1”。在三个描述符集中找出最大描述符值,然后加1,这就是第一个参数。也可以将第一个参数设置为FD_SETSIZE,这是<sys/select.h>中的一个常量,它说明了最大的描述符(经常是1024)。如果将第一个参数设置为我们关注的最大描述符编号值加1,内核就只需在此范围内寻找打开的位,而不必在三个描述符集中的数百位内搜索。

例如,若编写下列代码:

fd_set readset,writeset;  
FD_SERO(&readset);  
FD_ZERO(&writeset);  
FD_SET(0,&readset);  
FD_SET(3,&readset);  
FD_SET(1,&writeset);  
FD_SET(2,&writeset);  
select(4,readset,&writeset,NULL,NULL);

UNIX环境高级编程:I/O多路转接(select、pselect和poll)

因为描述符编号从0开始,所以要在最大描述符编号值上加1。第一个参数实际上是要检查的描述符(从描述符0开始)。

select有三个可能的返回值:

返回-1表示出错。出错是有可能的,例如在所指定的描述符都没有准备好时捕捉到一个信号。在此种情况下,将不修改其中任何描述符集。(即原先描述符值1的还是保持1,不变)

返回0表示没有描述符准备好。若指定的描述符都没有准备好,而且指定的时间已经超时,则发生这种情况。此时,所有描述符集皆被清0。

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/

正返回值表示已经准备好的描述符数,该值是三个描述符集中已经准备好的描述符数之和,所以如果同意描述符已准备好读和写,那么在返回值中将计2。在这种情况下,三个描述符集中仍旧打开的位对应于已准备好的描述符,其他没有准备好的清0。

如果在一个描述符上碰到了文件结尾处,则select认为该描述符是可读的。然后调用read,它返回0,这是UNIX系统指示到达文件结尾处的方法。(很多人错误的认为,当到达文件结尾处时,select会指示一个异常状态)。

二、pselect函数

#include <sys/select.h>  
int pselect(int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,const struct timespec *tsptr,const sigset_t *sigmask);//返回值:准备就绪的描述符数,若超时则返回0,若出错则返回-1

除以下几点,pselect与select相同:

select的超时值用timeval结构指定,但pselect使用timespec,timespec结构以秒和纳秒表示超时值,而非秒和微妙。如果平台支持这样精细的粒度,那么timespec就提供了更精准的超时时间。

对于pselect可使用一可选择的信号屏蔽字。若sigmask为空,那么在与信号有关的方面,pselect的运行状况和select相同。否则,sigmask指向一信号屏蔽字,在调用pselect时,以原子操作的方式安装该信号屏蔽字。在返回时恢复以前的信号屏蔽字。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读