Методу select () не известно об этих буферах; в результате он может указать, что нет больше данных для чтения из дескриптора файла, а в действительности данные будут оставаться в другом буфере. Это может привести к нарушению работы и путанице.
В мультиплексных программах следует избегать использования оператора {}, функций print ( ) и read (), а также встроенной функции getline () и метода IO::Handle->getline (). Вместо этого нужно применять исключительно только вызовы sysread () и syswrite ( ) низкого уровня. В результате выполнение построчного ввода-вывода усложняется. Однако далее будут описаны некоторые модули, позволяющие преодолеть это ограничение.
Корректировка нижних отметок
В некоторых версиях UNIX можно управлять готовностью сокета для чтения или записи, изменяя нижние отметки приемного и/или передающего буферов сокета. Нижняя отметка приемного буфера указывает, какой объем данных должен в нем накопиться, прежде чем метод select ( ) укажет, что он готов для чтения, и в этом случае функция sysread() может быть вызвана без блокировки. Нижняя отметка по умолчанию равна одному байту, но это значение можно изменить, вызвав метод setsockopt() с опцией SO_RCVLOWAT. Иногда может потребоваться изменить это значение, если от второго участника соединения ожидается получение фрагментов данных фиксированного размера и нет смысла заниматься обработкой неполных сообщений.
При записи в сокет нижняя отметка указывает, какое число байтов данных может быть записано в сокет с помощью функции syswrite (); без блокировки. По умолчанию нижняя отметка равна одному байту, но это значение можно изменить, вызвав метод setsockopt () с опцией SO_SNDL0WАТ.
В различных операционных системах средства изменения нижних отметок буферов сокета реализованы поразному. Они могут применяться в большинстве версий UNIX, но отсутствуют в системах Windows и Macintosh. Кроме того, ядро Linux (вплоть до версии 2.4) позволяет устанавливать нижнюю отметку приемного, но не передающего буфера.