В Solaris 10 функции асинхронного ввода/вывода включены в библиотеку libaio.so. Для сборки программ, использующих эти функции, необходимо использовать ключ –laio.
Для формирования запросов на асинхронный ввод/вывод используются функции aio_read(3AIO), aio_write(3AIO) и lio_listio(3AIO).
Функции aio_read(3AIO) и aio_write(3AIO) имеют единственный параметр, struct aiocb *aiocbp. Структура aiocb определена в файле <aio.h> и содержит следующие поля:
int aio_fildes – дескриптор файла
off_t aio_offset – смещение в файле, начиная с которого будет идти запись или чтение
volatile void* aio_buf – буфер, в который следует прочитать данные или в котором лежат данные для записи.
size_t aio_nbytes – размер буфера. Как и традиционный read(2), aio_read(3AIO) может прочитать меньше данных, чем было запрошено, но никогда не прочитает больше.
int aio_reqprio – приоритет запроса
struct sigevent aio_sigevent – способ оповещения о завершении запроса (рассматривается далее в этом разделе)
int aio_lio_opcode – при aio_read(3AIO) и aio_write(3AIO) не используется, используется только функцией lio_listio.
Функция lio_listio(3AIO) позволяет одним системным вызовом сформировать несколько запросов на ввод/вывод. Эта функция имеет четыре параметра:
|
|
int mode – может принимать значения LIO_WAIT (функция ждет завершения всех запросов) и LIO_NOWAIT (функция возвращает управление сразу после формирования всех запросов).
struct aiocb *list[] – список указателей на структуры aiocb с описаниями запросов. Запросы могут быть как на чтение, так и на запись, это определяется полем aio_lio_opcode. Запросы к одному дескриптору исполняются в том порядке, в каком они указаны в массиве list.
int nent – количество записей в массиве list.
struct sigevent *sig – способ оповещения о завершении всех запросов. Если mode==LIO_WAIT, этот параметр игнорируется.
Библиотека POSIX AIO предусматривает два способа оповещения программы о завершении запроса, синхронный и асинхронный. Сначала рассмотрим синхронный способ.