Однако такая конструкция не очень эффективна, поскольку повторная запись информации в один и тот же сокет, не готовый к записи, может просто привести к повторному появлению ошибки EWOULDBLOCK. Так может случиться при параллельном получении информации и способах их мониторинга и локализации. Гораздо лучше включить вызов функции syswrite () в цикл select () и выполнять другую работу, пока сокет не будет готов к приему дополнительных данных. В следующем разделе показано, как это сделать.
Применение неблокирующих дескрипторов в построчных операциях ввода-вывода
Как было описано ранее, применять функции построчного чтения в сочетании с функцией select () опасно, поскольку при выполнении функции select () не учитывается содержимое буферов библиотеки stdio. Еще одна проблема состоит в том, что функции построчного чтения блокируются, если невозможно считать целую строку, а как только блокируется любая из операций ввода-вывода, мультиплексная программа приостанавливается.
Дело в том, что нужно изменить семантику вызова функции getline () так, чтобы можно было различать три разные ситуации.
1) Из дескриптора файла была успешно считана полная строка.
2) Дескриптор файла содержит признак конца файла EOF или код ошибки.
3) Дескриптор файла еще не содержит полную строку, доступную для чтения.
Стандартный оператор <> и функция getline () языка Perl хорошо справляются с ситуациями 1 и 2, но блокируются в ситуации 3. Наша задача состоит в изменении этого поведения так, чтобы функция getline () немедленно выполняла возврат, если не готова для чтения полная строка, и позволяла отличить этот случай от ошибки ввода-вывода.