当nfds为0时,“select”函数会做什么?

4
int select(int nfds, 
           fd_set *readfds, 
           fd_set *writefds, 
           fd_set *exceptfds, 
           struct timeval *timeout);
select的第一个参数nfds应该是最大文件描述符加1,至少为1。
但我看到有些代码将nfds设置为0,这种使用方法合法吗?
此外,当nfds为负值或timeout包含无效值时,select的返回值被设置为EINVAL。同样,它没有指定nfds为0时会发生什么。

可能是为什么使用select()而不是sleep()?的重复问题。 - hyde
3个回答

7

5
这个手册页面说:

一些代码使用select()函数,三个集合都为空,nfds为零,并且timeout非空作为一种相当可移植的方式以亚秒精度休眠。


需要注意的是,如果有任何新手觉得这很困惑,在nanosleep被广泛支持之前,“select”是唯一可移植的方法来实现这一点,并且该引用已经在那个man页面上存在了那么长时间 - user2404501

3

它等待给定的超时时间,然后返回0,或者在EINTR早于超时时间发生时提前返回。如果你好好思考一下,这是完全有道理的,并且事实上文档也是这么说的,尽管它没有明确地表达出来。如果所有集合都为NULL或没有比nfds小的位被设置,同样会发生这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接