当select()系统调用中nfds=0时会发生什么?

4

我正在Linux上调试一个应用程序。它有几个线程定期调用select系统调用:

strace显示:

select(0, NULL, NULL, NULL, {1, 342414})

所以,nfds=0。我认为,readfdswritefdsexceptfds集合中出现的最高文件描述符号加一即为nfds值。它不能是标准输入(fd=0),因为这样nfds=1
那么,在这种情况下,nfds=0的含义是什么?
谢谢!
3个回答

6
通常情况下,select 函数会在超时到期或其中一个文件描述符发生事件时才会停止等待。如果没有文件描述符,则只剩下超时作为行为。
我的本地 manpage 上甚至包含以下文本:
“有些代码会使用 select() 函数并将所有三个集合设置为空、nfds 设置为零以及非空的 timeout 作为一种具有亚秒精度的可移植休眠方法。”

如果这是一种实现睡眠行为的方式,我想知道何时应该优先选择它而不是简单的sleep()调用。它们都是符合posix标准的调用。 - Yunus King
你的意思是:你想知道何时应该优先选择具有亚秒精度的“相当可移植的睡眠方式”,而不是sleep(unsigned seconds)?我认为当你想要睡眠,但不是整数秒时,就应该使用它。希望对你有所帮助。 - Useless
Ah select提供了更精细的超时控制。谢谢! - Yunus King

3

注意,描述符集全部为空指针。在这种情况下,第一个参数实际上没有被使用,select 仅仅是用来让线程睡眠。睡眠时间为 1 秒和 342414 微秒(除非有信号打断了睡眠)。


2
nfds参数并不是最大的描述符,而是最大描述符值+1。因此,如果您使用文件描述符0来监视标准输入stdin,则需要传入1。
实际上,select(0, NULL, NULL, NULL, {1, 342414})表示没有文件描述符,实际的文件描述符集被设置为NULL,因此它们甚至不会被检查。因此,在此调用中,只有超时会产生任何影响。

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