我正在Linux上调试一个应用程序。它有几个线程定期调用select
系统调用:
strace
显示:
select(0, NULL, NULL, NULL, {1, 342414})
所以,
nfds=0
。我认为,readfds
、writefds
和exceptfds
集合中出现的最高文件描述符号加一即为nfds
值。它不能是标准输入(fd=0
),因为这样nfds=1
。那么,在这种情况下,
nfds=0
的含义是什么?谢谢!
select
函数会在超时到期或其中一个文件描述符发生事件时才会停止等待。如果没有文件描述符,则只剩下超时作为行为。select()
函数并将所有三个集合设置为空、nfds 设置为零以及非空的 timeout 作为一种具有亚秒精度的可移植休眠方法。”注意,描述符集全部为空指针。在这种情况下,第一个参数实际上没有被使用,select
仅仅是用来让线程睡眠。睡眠时间为 1
秒和 342414
微秒(除非有信号打断了睡眠)。
nfds
参数并不是最大的描述符,而是最大描述符值+1。因此,如果您使用文件描述符0来监视标准输入stdin
,则需要传入1。select(0, NULL, NULL, NULL, {1, 342414})
表示没有文件描述符,实际的文件描述符集被设置为NULL,因此它们甚至不会被检查。因此,在此调用中,只有超时会产生任何影响。
sleep(unsigned seconds)
?我认为当你想要睡眠,但不是整数秒时,就应该使用它。希望对你有所帮助。 - Useless