2013-05-27 67 views
4
int select(int nfds, 
      fd_set *readfds, 
      fd_set *writefds, 
      fd_set *exceptfds, 
      struct timeval *timeout); 

selectnfds第一个参数,应该是最大的文件描述符加1,这应该是至少1
但我已经看到了一些代码设置NFDs的是0,这是使用合法的吗?
另外,当nfds为负数或timeout包含无效值时,返回值select设置为EINVAL。同样,它没有说明当nfds为0时发生了什么。当nfds为0时,“select”会做什么?

+0

可能重复的[为什么使用select()而不是sleep()?](http://stackoverflow.com/questions/3125645/why-use-select-instead-of-sleep) – hyde

回答

3

它等待了给定超时,然后返回0,或将其与EINTR返回越快。如果你仔细想一想,这是非常有道理的,事实上它就是文档所说的,尽管它没有明确地说出来。如果所有的设置都是NULL或者其中没有小于nfds的位,那么会发生同样的情况。

5

man page

一些代码调用select()与所有三套空,NFDS零,一个非空超时一个相当简便的方式与亚秒级精确睡觉。

+0

它应该是注意到,如果有任何新手发现这种混淆,那么'select'是在'nanosleep'得到广泛支持之前做到这一点的唯一可行的方法,并且该引用已经在那个长时间**的手册页中。 –

相关问题