Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Linux-инструменты для Windows-программистов
Назад Библиотеки API POSIX Вперед

Асинхронный ввод-вывод

Асинхронный ввод-вывод добавлен только в редакции стандарта POSIX.1g (1993г., одно из расширений реального времени). В вызове aio_read() даётся указание ядру начать операцию ввод-вывода, и указывается, каким сигналом уведомить процесс о завершении операции (включая копирование данных в пользовательский буфер). Вызывающий процесс не блокируется. Результат операции (например, полученная UDP дейтаграмма) может быть обработан, например, в обработчике сигнала. Разница с предыдущей моделью, управляемой сигналом, состоит в том, что в той модели сигнал уведомлял о возможности начала операции (вызове операции чтения), а в асинхронной модели сигнал уведомляет уже о завершении операции чтения в буфер пользователя.

Всё, что относится к асинхронному вводу-выводу в Linux описано в <aio.h>. Управляющий блок асинхронного ввода-вывода — видны все поля, которые обсуждались выше:

struct aiocb {                   /* Asynchronous I/O control block.  */ 
   int aio_fildes;               /* File desriptor.  */ 
   int aio_lio_opcode;           /* Operation to be performed.  */ 
   int aio_reqprio;              /* Request priority offset.  */ 
   volatile void *aio_buf;       /* Location of buffer.  */ 
   size_t aio_nbytes;            /* Length of transfer.  */ 
   struct sigevent aio_sigevent; /* Signal number and value.  */ 
...
}

Того же назначения блок для 64-битных операций:

struct aiocb64 {
...
}

И некоторые операции (в качестве примера):

int aio_read( struct aiocb *__aiocbp );

int aio_write( struct aiocb *__aiocbp );

Инициализация выполнения целой цепочки асинхронных операций (длиной __nent):

int lio_listio( int __mode, 
struct aiocb* const list[ __restrict_arr ], 
int __nent, struct sigevent *__restrict __sig ) ;

Как и для потоков pthread_t, асинхронные операции значительно легче породить, чем позже остановить... для чего также потребовался отдельный API:

int aio_cancel( int __fildes, struct aiocb *__aiocbp );

Можно предположить, что каждая асинхронная операция выполняется как отдельный поток, у которого не циклическая функция потока.


Предыдущий раздел: Оглавление Следующий раздел:
Ввод-вывод управляемый сигналом   Терминал, режим ввода: канонический и некононический