Немного расширив примеры и @ user207421 комментарий:
1 Может ли определенный дескриптор файла быть готовым для чтения, записи и обработки исключений одновременно?
ХорошоПримером будет сокет, который (почти) всегда будет готов к записи и будет готов к чтению, когда будут доступны данные. Обычно встречаются исключения - они используются для exceptional
ситуаций. Например, наличие внеполосного сообщения в соединениях TCP, но большинство приложений не используют эти функции.
Обратите внимание, что в readfds
будут отображаться «нормальные» ошибки (например, отключение сокета).
См. Также: * nix select и семантика excalfds / errorfds ,
На популярной сетевой странице Beej показан пример select (), в котором он проверяет участников. чтения fd_set с помощью цикла for. Поскольку цикл увеличивается на одну каждую итерацию, он обязательно будет проверять некоторые целые числа, которые не являются существующими файловыми дескрипторами:
Я считаю, что в этом случае это делается для упрощения примеров кода,и является разумной реализацией для большинства легких реализаций. Это работает хорошо, если число подключений без прослушивания очень мало.
Стоит отметить, что 'fd_set' реализован в Linux с набором битов, но в Windows (winsock) как массив значений fd,Полное сканирование всех FD будет O (n) в Linux и O (n * n) в Windows. Это может сильно повлиять на производительность большого приложения N для Windows.
В крупномасштабных приложениях, где сервер будет прослушивать сотни (или более) открытых соединений, каждое из которых требует различных действий, потенциально с несколькими состояниями,обычной практикой будет наличие списка активных соединений и использование обратного вызова для вызова функции. Обычно это реализуется с помощью 'Eventloop'. Примеры включают X11, серверы rpc и т. Д.
См. Также: https://en.wikipedia.org/wiki/Event_loop