Библиотека сайта rus-linux.net
Цилюрик О.И. Linux-инструменты для Windows-программистов | ||
Назад | Библиотеки API POSIX | Вперед |
Расширенные операции ввода-вывода
К этой части обычно относят рассмотрение
синхронного-асинхронного ввода-вывода, и вызовы select(),
pselect(), poll(), epoll()
. Пожалуй, самую ясную и
строгую классификацию моделей ввода-вывода в UNIX дал У. Р. Стивенс в [3] :
Прежде чем начать описание функций select
и poll
, мы должны вернуться назад и уяснить основные различия между пятью
моделями ввода-вывода, доступными нам в Unix:
- блокируемый ввод-вывод;
- неблокируемый ввод-вывод;
- мультиплексирование ввода-вывода (функции
select
и poll
);
- ввод-вывод, управляемый сигналом (сигнал SIGIO);
- асинхронный ввод-вывод (функции POSIX.1 aio_).
Блокируемый ввод — это самый часто
используемый, и самый известный вариант, когда выполняется операция
read()
, или даже элементарные вызовы getchar()
или gets()
, выполняемые в каноническом режиме ввода с терминала (консоли). Эта
модель ввода-вывода не нуждается в детальных комментариях.
Неблокирующий ввод-вывод
Неблокирующий ввод-вывод не ожидает наличия данных
(или возможности вывода), результат выполнения операции, или
невозможность её выполнения в данный момент определяется по анализу
кода возврата. Пример (файл e5.cc
архива fork.tgz
)
неблокирующего ввода был показан выше (в примере запуска дочернего
процесса-фильтра). Схематично (убрано всё лишнее) это выглядит так:
int fo[ 2 ]; // pipe – для чтения из дочернего процесса if( pipe( fo ) ) perror( "pipe" ), exit( EXIT_FAILURE ); close( fo[ 1 ] ); int cur_flg = fcntl( fo[ 0 ], F_GETFL ); // чтение должно быть в режиме O_NONBLOCK if( -1 == fcntl( fo[ 0 ], F_SETFL, cur_flg | O_NONBLOCK ) ) perror( "fcntl" ), exit( EXIT_FAILURE ); ... while( 1 ) { int n = read( fdi, buf, buflen ); if( n > 0 ) { // считаны данные ... обработка } else if( -1 == n ) { if( EAGAIN == errno ) { // данные не готовы printf( "not ready!\n" ); usleep( 300 ); continue; } else perror( "\nread pipe" ), exit( EXIT_FAILURE ); } }
Целая подборка примеров,
относящихся к неблокирующему вводу-выводу, применительно к сетевым
сокетам, заимствованных из [3] (потребовавших минимальных
изменений), находится в архиве ufd.tgz
каталог nonblock
.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Сигналы в потоках | Мультиплексирование ввода-вывода |