2009-05-12 9 views
2

Прототип:Как использовать функцию select() в программировании сокетов?

int select (int nfds, 
      fd_set *read-fds, 
      fd_set *write-fds, 
      fd_set *except-fds, 
      struct timeval *timeout); 

Я изо всех сил, чтобы понять эту функцию в течение некоторого времени. Мой вопрос в том, что если он проверяет все дескрипторы файлов от 0 до nfds-1 и изменяет read-fds, write-fds и except-fds при возврате, зачем мне нужно использовать FD_SET для добавления дескрипторов файлов в набор в начале он все равно проверяет все дескрипторы файлов или нет?

+0

Это что 'select', что было нарушено? :) –

ответ

2

Не проверяется с 0 до nfds -1. Первый аргумент просто дает верхнюю оценку того, насколько велики, численно, используемые файловые дескрипторы. Это связано с тем, что сам набор может быть представлен как битвектор, без возможности узнать, сколько бит фактически используется. Указание этого как отдельного аргумента помогает select() избежать проверки дескрипторов файлов, которые не используются.

Кроме того, дескриптор, который не является, например, набор для чтения, когда вы вызываете select(), вообще не проверяется, поэтому он не может появиться в наборе при возврате вызова.

0

У меня когда-то были те же сомнения, что и у вас. Вы можете посмотреть на следующий вопрос:

Query on Select System Call

+0

Спасибо, эта тема тоже очень полезна! –