我正在Linux上调试应用程序。它有几个线程会定期调用select系统调用:
strace
显示:
select(0, NULL, NULL, NULL, {1, 342414})
所以nfds=0
。我认为nfds是出现在readfds
,writefds
和exceptfds
中的任何一组中最高的文件描述符号,加1。它不能是标准输入(fd=0
),因为这样将有nfds=1
。
在这种情况下,nfds=0
是什么意思?
谢谢!
答案 0 :(得分:4)
通常select
会休眠直到超时到期或某个文件描述符中发生一个事件。如果没有文件描述符,则超时是唯一剩余的行为。
我在select(2)
的本地联机帮助页中甚至包含文字
某些代码会调用select(),将所有三个集合都设置为空,nfds为零,并且将非NULL超时作为亚秒级精度的一种可移植的睡眠方式。
答案 1 :(得分:2)
请注意,描述符集都是空指针。在那种情况下,第一个参数并没有真正使用,select
仅用于使线程进入睡眠状态。持续1
秒和342414
微秒(除非有信号中断睡眠)。
答案 2 :(得分:1)
nfds
参数不是最大的描述符,而是最大的+1。因此,如果您以文件描述符0观看stdin
,则需要传入1。
有效地select(0, NULL, NULL, NULL, {1, 342414})
表示没有文件描述符,并且实际的文件描述符集以NULL的形式传入,因此即使进行检查也要注意。因此,只有超时才会在此调用中起作用。