* nix select и семантика excalfds / errorfds - PullRequest
42 голосов
/ 27 августа 2009

Системный вызов select принимает 3 набора файловых дескрипторов для просмотра fds для чтения / записи и «исключений» для файлового дескриптора.

Моя выбранная справочная страница не так много говорит о наборе дескрипторов exceptfd. Для чего его используют; какие исключения могут и будут ли они сообщаться в файловых дескрипторах?

Я предполагаю, что это может отличаться для типа дескриптора ... будь то TCP-сокет, канал, tty и т. Д.). Кто-нибудь имеет больше информации о том, какие ошибки select может сообщать о различных видах дескрипторов?

Ответы [ 2 ]

31 голосов
/ 28 августа 2009

Иногда считается, что кроме fds требуется для обнаружения ошибок, но это ошибочное представление. Ошибки будут помечены в readfds . Хотя POSIX требует этого (и даже вызывает параметр errorfds ), от ОС зависит, отмечены ли ошибки и в , за исключением fds . Действительно, этот параметр необходим только в том случае, если вы заботитесь о исключительных условиях , но только в редких случаях возникает необходимость их обнаружения.

То, что считается исключительным условием, зависит от типа файлового дескриптора, но на сегодняшний день наиболее распространенным является использование сокета TCP, где он указывает, что внеполосные данные доступны для чтения с использованием recv() с MSG_OOB флаг. Однако внеполосные данные TCP имеют ряд особенностей (например, только 1 байт может быть непогашенным), и в результате они используются редко.

В последних версиях Linux кроме файловой системы можно использовать для обнаружения изменений определенных атрибутов sysfs. Текущее значение атрибута можно прочитать, прочитав соответствующий файл в /sys, а select() в дескрипторе файла будет помечать кромеfds при изменении атрибута. Однако в настоящее время это работает только для некоторых атрибутов и для изменений монтирования (/proc/mounts).

Кроме того, некоторые драйверы устройств помечают определенные специфические для устройства условия, используя кромеfds .

3 голосов
/ 27 августа 2009

Вы правы, это зависит от типа устройства, на которое вы ссылаетесь с файловыми дескрипторами. Так что для сокетов, FIFO, последовательных портов и т. Д. Все по-другому ...

Посмотрите справочную страницу для чтения (). Внизу (по крайней мере, в OS X) перечислены различные ошибки, которые вы можете получить для разных устройств. То же самое касается записи ().

Для сокетов, FIFO и других механизмов IPC я бы проверил сетевое программирование Unix, тома 1 и 2. IIRC описывает, какие ошибки следует ожидать при различных условиях ошибки.

Я прошел этот путь один раз с FIFO. Я закончил мозговым штурмом все способы, которыми производитель и потребитель могли взаимодействовать с каждым концом FIFO, а затем написал тестовые примеры для каждой из этих ситуаций. Это был хороший (хотя и утомительный) способ обнаружить все возможные ошибки. Хотя я многому научился, и в конечном итоге код просто работает.

...