Provided by: manpages-ru-dev_4.21.0-2_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
       или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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

Linux man-pages 6.03                            5 февраля 2023 г.                                   io_submit(2)