Provided by: manpages-ru-dev_4.19.0-7_all bug

ИМЯ

       io_submit - отправляет асинхронные блоки ввода-вывода для обработки

LIBRARY

       Standard C library (libc, -lc)

       Alternatively, Asynchronous I/O library (libaio, -laio); see NOTES.

СИНТАКСИС

       #include <linux/aio_abi.h>          /* определяет необходимые типы */

       int io_submit(aio_context_t ctx_id, long nr, struct iocb **iocbpp);

       Замечание:  В  glibc  нет  обёрточной  функции  для  данного  системного  вызова; смотрите
       ЗАМЕЧАНИЯ.

ОПИСАНИЕ

       Note: this page describes the raw Linux  system  call  interface.   The  wrapper  function
       provided by libaio uses a different type for the ctx_id argument.  See NOTES.

       Системный вызов io_submit() ставит в очередь nr запросов блоков ввода-вывода для обработки
       в контексте AIO ctx_id. Значение iocbpp должно быть массивом из nr управляющих блоков AIO,
       которые будут отправлены в контекст ctx_id.

       Структура iocb (блок управления вводом-выводом), определённая в linux/aio_abi.h, описывает
       параметры, которыми управляется операция ввода-вывода.

           #include <linux/aio_abi.h>

           struct iocb {
               __u64   aio_data;
               __u32   PADDED(aio_key, aio_rw_flags);
               __u16   aio_lio_opcode;
               __s16   aio_reqprio;
               __u32   aio_fildes;
               __u64   aio_buf;
               __u64   aio_nbytes;
               __s64   aio_offset;
               __u64   aio_reserved2;
               __u32   aio_flags;
               __u32   aio_resfd;
           };

       Поля этой структуры имеют следующее назначение:

       aio_data
              Эти данные копируются в поле data структуры io_event  при  завершении  ввода-вывода
              (смотрите io_getevents(2)).

       aio_key
              Внутреннее   поле,   используется   ядром.  Не  изменяйте  это  поле  после  вызова
              io_submit().

       aio_rw_flags
              Флаги чтения-записи, передаваемые со структурой. Возможные значения:

              RWF_APPEND (начиная с Linux 4.16)
                     Добавить данный в конец файла. Смотрите описание флага с таким же  именем  в
                     pwritev2(2),   а   также   описание  O_APPEND  в  open(2).  Поле  aio_offset
                     игнорируется. Файловое смещение не изменяется.

              RWF_DSYNC (начиная с Linux 4.13)
                     Операция  записи  завершается  согласно   требованиям   целостности   данных
                     синхронизированного  ввода-вывода. Смотрите описание флага с тем же именем в
                     pwritev2(2), а также описание O_DSYNC в open(2).

              RWF_HIPRI (начиная с Linux 4.13)
                     Запрос с высоким приоритетом; опросить, если возможно

              RWF_NOWAIT (начиная с Linux 4.14)
                     Не ждать, если ввод-вывод блокирует операции, такие как  выделение  файловых
                     блоков,   очистка   грязной  страницы,  блокировку  мьютексов  или  вызывает
                     перегрузку блочного устройства внутри ядра. Если имеется что-то из этого, то
                     управляющий  блок  возвращается  немедленно  со значением -EAGAIN в поле res
                     структуры io_event (смотрите io_getevents(2)).

              RWF_SYNC (начиная с Linux 4.13)
                     Операция  записи  завершается   согласно   требованиям   целостности   файла
                     синхронизированного  ввода-вывода. Смотрите описание флага с тем же именем в
                     pwritev2(2), а также описание O_SYNC в open(2).

       aio_lio_opcode
              Тип ввода-вывода,  выполняемый  структурой  iocb.  Возможные  значения,  определены
              перечислением в linux/aio_abi.h:

                  enum {
                      IOCB_CMD_PREAD = 0,
                      IOCB_CMD_PWRITE = 1,
                      IOCB_CMD_FSYNC = 2,
                      IOCB_CMD_FDSYNC = 3,
                      IOCB_CMD_POLL = 5,
                      IOCB_CMD_NOOP = 6,
                      IOCB_CMD_PREADV = 7,
                      IOCB_CMD_PWRITEV = 8,
                  };

       aio_reqprio
              Определяет приоритет запросов.

       aio_fildes
              Файловый дескриптор, над которым будут выполняться операции ввода-вывода.

       aio_buf
              Буфер, используемый для пересылки данных при операции чтения или записи.

       aio_nbytes
              Размер буфера, на который указывает aio_buf.

       aio_offset
              Файловое смещение, начиная с которого будут выполняться операции ввода-вывода.

       aio_flags
              Набор флагов, связанный со структурой iocb. Допускаемые значения:

              IOCB_FLAG_RESFD
                     Управление   асинхронным  вводом-выводом  должно  сигнализировать  файловому
                     дескриптору в aio_resfd после выполнения.

              IOCB_FLAG_IOPRIO (начиная с Linux 4.18)
                     Считать поле aio_reqprio как IOPRIO_VALUE, определённое в linux/ioprio.h.

       aio_resfd
              Файловый дескриптор для сигнализации завершения асинхронного ввода-вывода.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При успешном выполнении io_submit() возвращает количество отправленных  iocb  (может  быть
       меньше nr или 0, если nr равно нулю). Случаи ошибок описаны в ЗАМЕЧАНИЯХ.

ОШИБКИ

       EAGAIN Недостаточно ресурсов для постановки в очередь iocb.

       EBADF  Некорректный файловый дескриптор, указанный в первом iocb.

       EFAULT Одна из структур данных указывает на некорректные данные.

       EINVAL Некорректен  контекст  AIO, указанный ctx_id. Значение nr меньше 0. Значение iocb в
              *iocbpp[0]  некорректно  инициализировано,  указанная  операция   некорректна   для
              файлового дескриптора в iocb или некорректное значение в поле aio_reqprio.

       ENOSYS Вызов io_submit() не реализован для этой архитектуры.

       EPERM  Поле  aio_reqprio  содержит  класс  IOPRIO_CLASS_RT,  но представляющий контекст не
              имеет мандата CAP_SYS_ADMIN.

ВЕРСИИ

       Асинхронные системные вызовы ввода-вывода впервые появились в Linux 2.5.

СТАНДАРТЫ

       Вызов io_submit() есть только в  Linux,  и  он  не  должен  использоваться  в  переносимых
       программах.

ЗАМЕЧАНИЯ

       glibc  does  not  provide  a  wrapper  for  this  system  call.  You could invoke it using
       syscall(2).  But instead, you probably want  to  use  the  io_submit()   wrapper  function
       provided by libaio.

       Заметим,  что в обёрточной функции libaio используется другой тип (io_context_t) аргумента
       ctx_id. Также заметим, что libaio не следует соглашениям обычной библиотеки C для возврата
       ошибок: при ошибке она возвращает отрицательный номер ошибки (из списка в разделе ОШИБКИ).
       Если системный вызов вызывается с помощью syscall(2),  то  возвращаемое  значение  следует
       обычным  соглашениям  для  указания  на  ошибку:  возвращается  -1  и в errno записывается
       (положительное) значение возникшей ошибки.

СМ. ТАКЖЕ

       io_cancel(2), io_destroy(2), io_getevents(2), io_setup(2), aio(7)

ПЕРЕВОД

       Русский   перевод   этой    страницы    руководства    был    сделан    Azamat    Hackimov
       <azamat.hackimov@gmail.com>,    Dmitriy   S.   Seregin   <dseregin@59.ru>,   Yuri   Kozlov
       <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.