При выполнении функций sysread () и syswrite (), как всегда, могут встретиться и другие ошибки ввода-вывода. Константа EWOULDBLOCK может быть импортирована из модуля Errno.
Еще одной отличительной особенностью неблокирующего, дескриптора является то, что он допускает частичную запись. При использовании обычного блокирующего дескриптора функция syswrite () не выполняет возврат, пока не появится возможность выполнить весь запрос. Данная способность очень полезна при настройке ноутбука или других отладочных функциях. Однако при неблокирующих дескрипторах это поведение меняется — при появлении возможности немедленно выполнить не весь запрос на запись, а только его часть, функция syswrite () записывает возможный объем данных, а затем возвращает число отправленных байтов. Напомним, что частичное чтение с помощью функции sysread () всегда возможно, независимо от состояния блокировки дескриптора.
Создание неблокирующих дескрипторов: функциональный интерфейс
В языке Perl предусмотрен и интерфейс низкого уровня, и объектно ориентированный интерфейс для создания и применения неблокирующих дескрипторов. Вначале будет рассмотрен интерфейс низкого уровня, а затем будет показано, насколько удобнее становится API-интерфейс в объектно-ориентированных версиях.
Вызов функции sysopen (), которая была представлена ранее, позволяет отметить дескриптор файла как неблокирующий при его открытии. Общая схема состоит в добавлении флажка nonblock к флажкам, передаваемым в параметре $mode. Например, чтобы открыть устройство /dev/tape0 для неблокирующей записи, можно применить вызов:
use Fcntl;
sysopen (ТАРЕ,’/dev/tape0’,0_WR0NLY10_N0NBL0CK) ;
Функция sysopen () работает только с локальными файлами и не может применяться для открытия каналов или сокетов. Поэтому создание неблокирующих дескриптором файлов таким способом обычно применяется только при работе с медленными локальными устройствами, такими как лентопротяжки.