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

时间:2018-09-13 08:45:54

标签: c linux

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

strace显示:

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

所以nfds=0。我认为nfds是出现在readfdswritefdsexceptfds中的任何一组中最高的文件描述符号,加1。它不能是标准输入(fd=0),因为这样将有nfds=1

在这种情况下,nfds=0是什么意思?

谢谢!

3 个答案:

答案 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的形式传入,因此即使进行检查也要注意。因此,只有超时才会在此调用中起作用。

相关问题