io_getevents - считывает асинхронные события ввода/вывода из очереди
io_getevents(2)
считывает асинхронные события ввода/вывода из очереди
ОБЗОР
#include <linux/aio_abi.h> /* определяет необходимые типы */
#include <linux/time.h> /* определяет «struct timespec» */
int io_getevents(aio_context_t ctx_id, long min_nr, long nr,
struct io_event *events, struct timespec *timeout);
Замечание:В glibc нет обёрточной функции для данного системного вызова;
смотрите
ЗАМЕЧАНИЯ.
ОПИСАНИЕ
Системный вызов io_getevents() пытается считать, по меньшей мере, от
min_nr до nr событий из очереди выполнения контекста AIO, указанном в
ctx_id.
В аргументе timeout задаётся время (относительное значение) ожидания
событий в виде структуры:
struct timespec {
time_t tv_sec; /* секунды */
long tv_nsec; /* наносекунды [0 .. 999999999] */
};
Указанное время округляется до точности системных часов и гарантируется, что
он не будет просрочено/сработает раньше.
Указание в timeout значения NULL приводит к бесконечной блокировке — до
получения не менее min_nr событий.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении
io_getevents() возвращается количество
прочитанных событий. Оно может быть 0 или меньше
min_nr, если
timeout
просрочен. Также может возвращаться ненулевое значение меньше
min_nr,
если вызов был прерван обработчиком сигнала.
Значения при ошибках смотрите в разделе
ЗАМЕЧАНИЯ.
ОШИБКИ
EFAULT
Задан неправильный указатель в events или timeout.
EINVAL
Неверное значение ctx_id. Значение min_nr или nr лежит за пределами
диапазона.
EINTR
Прерван обработчиком сигнала; смотрите signal(7).
ENOSYS
Вызов io_getevents() не реализован для данной архитектуры.
ВЕРСИИ
Асинхронные системные вызовы ввода-вывода впервые появились в Linux 2.5.
СООТВЕТСТВИЕ СТАНДАРТАМ
Вызов io_getevents() есть только в Linux, и он не должен использоваться в
переносимых программах.
ЗАМЕЧАНИЯ
В glibc нет обёрточной функции для данного системного вызова. Вы можете
вызвать его с помощью
syscall(2). Но лучше воспользоваться обёрточной
функцией
io_getevents() из библиотеки
libaio.
Заметим, что в обёрточной функции libaio используется другой тип
(io_context_t) аргумента ctx_id. Также заметим, что libaio не
следует соглашениям обычной библиотеки C для возврата ошибок: при ошибке она
возвращает отрицательный номер ошибки (из списка в разделе
ОШИБКИ). Если
системный вызов вызывается с помощью
syscall(2), то возвращаемое значение
следует обычным соглашениям для указания на ошибку: возвращается -1 и в
errno записывается (положительное) значение возникшей ошибки.
ДЕФЕКТЫ
Некорректное значение
ctx_id может привести к ошибке сегментирования, а
не генерации ошибки
EINVAL.