当前位置:  开发笔记 > 编程语言 > 正文

查询选择系统调用

如何解决《查询选择系统调用》经验,为你挑选了1个好方法。

select()定义为:

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

nfds表示所有给定集合中的最高文件描述符加1.我想知道为什么fd_set信息可用时select()需要这些数据.

如果集合中的FD4,8,9,则nfds的值将为10. select()moniter fds 9,8,7,6,5,4?



1> Tyler McHenr..:

问题在于,fd_set并不像你想象的那样真正"集合".幕后细节是fd_set的实现只是一个用作位域的整数.换句话说,执行

fd_set foo;
FD_CLEAR(&foo);
FD_SET(&foo, 3);

将foo设置为十进制值8 - 它将第四最不重要的位设置为1(记住0是有效的描述符).

FD_SET(&foo, 3);

相当于

foo |= (1 << 3);

因此,为了使select正常工作,需要知道fd_set的哪些位是您关心的位.否则,它将无法告知"在"集合中的零位,但是从"不在"集合中的零位设置为假.

在您的示例中,具有4,8和9集且n = 10的fd_set被解释为"具有10个条目的集合(fds 0-9).条目4,8和9为真(监视它们).条目1 ,2,3,5,6,7是假的(不监视它们.)任何大于9的fd值都不在设定的时间内."

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有