大家好,欢迎来到IT知识分享网。
问题一:fd_set和timeval的重置。
select函数的使用一般分为以下几步
1、FD_ZERO(fd_set*);
2、FD_SET(int fd,fd_set*);
3、int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
4、FD_ISSET(int fd, fd_set *set);
仔细观察以上函数会发现,fd_set参数和timeval参数传递的全是其变量指针。然而,经过实验四个函数均会通过指针对fd_set和timeval的最初值进行更改,因此,在每次调用select函数之前必须对fd_set和timeval进行重置,使二者保持正确的初始值。
问题二:select函数中第一参数(int n)的设置。
该参数代表的是select函数监听描述字集的最大值即最大位数,使用的是开区间。我们知道使用FD_SET是对描述字集进行设置,而实际上的操作是对于描述字集fd_set的对应位置1,例如int fd = 5,则执行FD_SET宏后,fd_set描述字的第五位置1,即***10000;若此时,fd_set不足5位则无法完成fd_set描述字集的正确注册,因此,每次调用select函数之前都要保证n大于描述字集fd_set的最大位数,即最大位数+1。
综上所述,使用select函数,在每次进行描述字集注册,即调用select函数之前一定要注意fd_set、timeval和n的重置。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22826.html