Нужно ли сбрасывать fd_set между системным вызовом select? - PullRequest
8 голосов
/ 30 декабря 2010

У меня проблема с использованием функции выбора в Unix.

У меня есть сервер, который ждет соединения.Сначала я добавляю дескриптор файла сокета прослушивания listener к fd_set readfds, используя FD_SET(listener, readfds), а затем использую это в select().

Когда я получаю соединение, я звоню accept() и устанавливаю readfds в выбранном дескрипторе файла и начинаю получать данные от соединения.Однако, когда я проверяю код в strace, select не показывает слушателя в readfds, пока select() выполняется во второй раз.

Нужно ли снова устанавливать дескриптор файла слушателя, используя FD_SET(listener, readfds) перед повторным вызовом select()?

Спасибо.

Ответы [ 2 ]

12 голосов
/ 30 декабря 2010

Да (необходимо сбросить fd_set между select() системными вызовами).

Это неприятно, но они действуют как параметры ввода / вывода;они читаются и изменяются системным вызовом.Когда возвращается select(), все значения были изменены, чтобы отразить готовый набор дескрипторов файлов.Таким образом, каждый раз перед вызовом select() вы должны (повторно) инициализировать значения fd_set.

3 голосов
/ 30 декабря 2010

Джонатан прав. Вам нужно каждый раз делать следующее:

set readFDs
set writeFDs
set errorFDs
select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...