2013-05-27 3 views
4
int select(int nfds, 
      fd_set *readfds, 
      fd_set *writefds, 
      fd_set *exceptfds, 
      struct timeval *timeout); 

Первый параметр select, nfds, должен быть максимальный дескриптор файла плюс 1, который должен быть не менее 1.
Но я видел, что некоторые коды установить nfds быть 0, это использование законно?
Плюс, возвращаемое значение select установлено на EINVAL, когда nfds отрицательный, или timeout содержит недопустимое значение. Опять же, в нем не указывается, что произошло, когда nfds равно 0.Что делает «select», когда nfds равно 0?

+0

возможно дубликат [Зачем использовать выбора() вместо сна()?] (Http://stackoverflow.com/questions/3125645/why-use-select-instead-of-sleep) – hyde

ответ

6

Можно использовать в качестве альтернативы для sleep. Я считаю, что это достигается путем определения всех параметров как 0/NULL, кроме таймаута. Проконсультируйтесь

Why use select() instead of sleep()?

3

Он ждет заданного тайм-аута, а затем возвращает 0, или она возвращается раньше с EINTR. Если вы думаете об этом, это имеет смысл и на самом деле то, что говорится в документации, даже если оно не говорит об этом явно. То же самое происходит, если все наборы имеют NULL или не имеют битов, размер которых меньше nfds.

5

Это man page говорит, что

Некоторые код вызывает выберите() со всеми тремя наборами пустых, nfds ноль, а не-NULL таймаут как довольно переносимым способом спать с субсекундной точностью.

+0

Это должно быть отметил, что в случае, если какие-либо новички найдут это сбивающим с толку, что 'select' был переносным способом * только *, чтобы сделать это до того, как« nanosleep »получил широкую поддержку, и эта цитата была на этой странице man для **, что долго **. –

Смежные вопросы