Внеполосные данные применяются не очень широко. Они используются в протоколах Telnet и Rlogin, а также FTP. Во всех случаях внеполосные данные уведомляют собеседника об исключительной ситуации (например, прерывании на стороне клиента), после чего собеседник сбрасывает все принятые данные до отметки внеполосных данных.
Упражнения
1. Есть ли разница между одним вызовом функции
send(fd, "ab", 2, MSG_OOB);
и двумя последовательными вызовами
send(fd, "a", 1, MSG_OOB);
send(fd, "b", 1, MSG_OOB);
?
2. Переделайте программу, приведенную в листинге 24.4, так, чтобы использовать функцию poll
вместо функции select
.
Глава 25
Управляемый сигналом ввод-вывод
25.1. Введение
Ввод-вывод, управляемый сигналом, подразумевает, что мы указываем ядру проинформировать нас сигналом, если что-либо произойдет с дескриптором. Исторически такой ввод-вывод назвали
Следует отметить, что неблокируемый ввод-вывод, описанный в главе 16, также не является асинхронным. При неблокируемом вводе-выводе ядро не возвращает управление после инициирования операции ввода-вывода. Управление возвращается немедленно, только если операция не может быть выполнена без блокирования процесса.
Стандарт POSIX обеспечивает истинный асинхронный ввод-вывод с помощью функций aio_XXX. Эти функции позволяют процессу решить, генерировать ли при завершении ввода-вывода сигнал, и какой именно.
Беркли-реализации поддерживают ввод-вывод, управляемый сигналом, для сокетов и устройств вывода с помощью сигнала SIGIO
. SVR4 поддерживает ввод- вывод, управляемый сигналом, для устройств STREAMS с помощью сигнала SIGPOLL
, который в данном случае приравнивается к SIGIO
.
25.2. Управляемый сигналом ввод-вывод для сокетов
Для использования управляемого сигналом ввода-вывода с сокетом (SIGIO
) необходимо, чтобы процесс выполнил три следующих действия:
1. Установил обработчик сигнала SIGIO
.
2. Задал владельца сокета. Обычно это выполняется с помощью команды F_SETOWN
функции fcntl
(см. табл. 7.9).
3. Разрешил управляемый сигналом ввод-вывод для данного сокета, что обычно выполняется с помощью команды F_SETFL
функции fcntl
или путем включения флага O_ASYNC
(см. табл. 7.9).