.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2007, 2010 Michael Kerrisk .\" and Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified Sat Jul 24 18:34:44 1993 by Rik Faith (faith@cs.unc.edu) .\" Merged readv.[23], 2002-10-17, aeb .\" 2007-04-30 mtk, A fairly major rewrite to fix errors and .\" add more details. .\" 2010-11-16, mtk, Added documentation of preadv() and pwritev() .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH readv 2 "5 февраля 2023 г." "Linux man\-pages 6.03" .SH ИМЯ readv, writev, preadv, pwritev, preadv2, pwritev2 \- читает или пишет данные в несколько буферов .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fBssize_t readv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP \fBssize_t writev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP .PP \fBssize_t preadv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB);\fP \fBssize_t pwritev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB);\fP .PP \fBssize_t preadv2(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB, int \fP\fIflags\fP\fB);\fP \fBssize_t pwritev2(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBpreadv\fP(), \fBpwritev\fP(): .nf Начиная с glibc 2.19: _DEFAULT_SOURCE В версии glibc 2.19 и более ранних: _BSD_SOURCE .fi .SH ОПИСАНИЕ Системный вызов \fBreadv\fP() считывает \fIiovcnt\fP буферов из файла, связанного с файловым дескриптором \fIfd\fP, в буферы, описываемые \fIiov\fP («разнесённый ввод»). .PP Системный вызов \fBwritev\fP() записывает \fIiovcnt\fP буферов, описанных \fIiov\fP, в файл, связанный с файловым дескриптором \fIfd\fP («сборный вывод»). .PP The pointer \fIiov\fP points to an array of \fIiovec\fP structures, described in \fBiovec\fP(3type). .PP Системный вызов \fBreadv\fP() работает также как \fBread\fP(2), но считывает несколько буферов. .PP Системный вызов \fBwritev\fP() работает также как \fBwrite\fP(2), но записывает несколько буферов. .PP Буферы выбираются в порядке, в каком они указаны в массиве. Это означает, что \fBreadv\fP() сначала полностью заполнит \fIiov[0]\fP, и только потом перейдёт к \fIiov[1]\fP, и так далее. (Если данных недостаточно, то могут быть заполнены не все буферы, на которые указывает \fIiov\fP.) Подобным образом \fBwritev\fP() запишет сначала всё содержимое \fIiov[0]\fP, затем \fIiov[1]\fP, и так далее. .PP .\" Regarding atomicity, see https://bugzilla.kernel.org/show_bug.cgi?id=10596 Выполняемые вызовами \fBreadv\fP() и \fBwritev\fP() пересылки данных атомарны: данные записываются \fBwritev\fP() единичным блоком, который не перемешивается с выводом других процессов; аналогично, \fBreadv\fP() гарантированно считывает непрерывный блок данных из файла, независимо от операций чтения из других нитей или процессов, которые имеют файловые дескрипторы, ссылающиеся на это же открытое файловое описание (см. \fBopen\fP(2)). .SS "preadv() и pwritev()" В системном вызове \fBpreadv\fP() объединены возможности \fBreadv\fP() и \fBpread\fP(2). Он выполняет ту же задачу что и \fBreadv\fP(), но имеет четвёртый аргумент \fIoffset\fP, задающий файловое смещение, по которому нужно выполнить операцию чтения. .PP В системном вызове \fBpwritev\fP() объединены возможности \fBreadv\fP() и \fBpwrite\fP(2). Он выполняет ту же задачу что и \fBwritev\fP(), но имеет четвёртый аргумент \fIoffset\fP, задающий файловое смещение, по которому нужно выполнить операцию записи. .PP Файловое смещение не изменяется данными вызовами. Файл, заданный в \fIfd\fP, должен позволять изменение смещения. .SS "preadv2() и pwritev2()" Данные системные вызовы подобны \fBpreadv\fP() и \fBpwritev\fP(), но имеют дополнительный пятый аргумент \fIflags\fP, который изменяет поведение в зависимости от вызова. .PP В отличие от \fBpreadv\fP() и \fBpwritev\fP(), если аргумент \fIoffset\fP равен \-1, то текущее файловое смещение используется и обновляется. .PP Аргумент \fIflags\fP содержит побитовое ИЛИ нуля и более следующих флагов: .TP \fBRWF_DSYNC\fP (начиная с Linux 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 Эквивалентен флагу \fBO_DSYNC\fP для \fBopen\fP(2), но действующий в конкретной операции записи. Этот флаг имеет смысл только для \fBpwritev2\fP(), и его действие распространяется только на диапазон данных, записываемым системным вызовом. .TP \fBRWF_HIPRI\fP (начиная с Linux 4.6) Высокоприоритетное чтение/запись. Позволяет в файловых системах на основе блоков использовать опрос устройства с низкой задержкой, но с возможностью использовать дополнительные ресурсы (в настоящий момент это свойство работает только для файлового дескриптора, открытого с флагом \fBO_DIRECT\fP). .TP \fBRWF_SYNC\fP (начиная с Linux 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 Эквивалентен флагу \fBO_SYNC\fP для \fBopen\fP(2), но действующий в конкретной операции записи. Этот флаг имеет смысл только для \fBpwritev2\fP(), и его действие распространяется только на диапазон данных, записываемым системным вызовом. .TP \fBRWF_NOWAIT\fP (начиная с Linux 4.14) .\" commit 3239d834847627b6634a4139cf1dc58f6f137a46 .\" commit 91f9943e1c7b6638f27312d03fe71fcc67b23571 Do not wait for data which is not immediately available. If this flag is specified, the \fBpreadv2\fP() system call will return instantly if it would have to read data from the backing storage or wait for a lock. If some data was successfully read, it will return the number of bytes read. If no bytes were read, it will return \-1 and set \fIerrno\fP to \fBEAGAIN\fP (but see \fBBUGS\fP). Currently, this flag is meaningful only for \fBpreadv2\fP(). .TP \fBRWF_APPEND\fP (начиная с Linux 4.16) .\" commit e1fc742e14e01d84d9693c4aca4ab23da65811fb Предоставляет эквивалент флага \fBO_APPEND\fP для \fBopen\fP(2) для каждой записи. Данный флаг значим только для \fBpwritev2\fP(), и его действие проявляется только для диапазона данных, записанных системным вызовом. Аргумент \fIoffset\fP не учитывается при операции записи; данные всегда добавляются в конец файла. Однако, если аргумент \fIoffset\fP равен \-1, то обновляется текущее смещение файла. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBreadv\fP(), \fBpreadv\fP() и \fBpreadv2\fP() возвращается количество считанных байт; вызовы \fBwritev\fP(), \fBpwritev\fP() and \fBpwritev2\fP() возвращают количество записанных байт. .PP Заметим, что для успешного выполнения не считается ошибкой передача меньшего количества байт чем запрошено (смотрите \fBread\fP(2) и \fBwrite\fP(2)). .PP В случае ошибки возвращается \-1, а \fIerrno\fP устанавливается в значение ошибки. .SH ОШИБКИ Вызовы могут возвращать те же ошибки что и \fBread\fP(2) и \fBwrite\fP(2). Кроме этого, \fBpreadv\fP(), \fBpreadv2\fP(), \fBpwritev\fP() и \fBpwritev2\fP() также могут завершаться с ошибками как у \fBlseek\fP(2). Дополнительно определены следующие ошибки: .TP \fBEINVAL\fP Сумма значений \fIiov_len\fP превышает значение \fIssize_t\fP. .TP \fBEINVAL\fP Количество векторов \fIiovcnt\fP меньше нуля или больше разрешённого максимума. .TP \fBEOPNOTSUPP\fP В \fIflags\fP указан неизвестный флаг. .SH ВЕРСИИ Вызовы \fBpreadv\fP() и \fBpwritev\fP() впервые появились в Linux 2.6.30; поддержка в библиотеке добавлена в glibc 2.10. .PP Вызовы \fBpreadv2\fP() и \fBpwritev2\fP() впервые появились в Linux 4.6. Поддержка в библиотеке glibc добавлена в версии 2.26. .SH СТАНДАРТЫ .\" Linux libc5 used \fIsize_t\fP as the type of the \fIiovcnt\fP argument, .\" and \fIint\fP as the return type. .\" The readv/writev system calls were buggy before Linux 1.3.40. .\" (Says release.libc.) \fBreadv\fP(), \fBwritev\fP(): POSIX.1\-2001, POSIX.1\-2008, 4.4BSD (данные системные вызовы впервые появились в 4.2BSD). .PP \fBpreadv\fP(), \fBpwritev\fP(): нет в стандарте, но есть в современных BSD. .PP \fBpreadv2\fP(), \fBpwritev2\fP(): нестандартные расширения Linux. .SH ЗАМЕЧАНИЯ .\" .\" Согласно POSIX1, в реализации можно устанавливать ограничение на количество элементов, которые можно передать в \fIiov\fP. Реализация может объявить это ограничение в \fBIOV_MAX\fP (в файле \fI\fP) или во время выполнения в виде возвращаемого значения \fIsysconf(_SC_IOV_MAX)\fP. В современных Linux данное ограничение равно 1024. В времена Linux 2.0 оно было равно 16. .SS "Отличия между библиотекой C и ядром" Объявления системных вызовов \fBpreadv\fP() и \fBpwritev\fP() немного отличаются от им соответствующих обёрточных функций библиотеки GNU C; они показаны в ОБЗОРЕ. Последний аргумент, \fIoffset\fP, раскладывается обёрточными функциями на два для системных вызовов: .PP \fB unsigned long \fP\fIpos_l\fP\fB, unsigned long \fP\fIpos\fP .PP В этих аргументах содержатся старшая и младшая 32\-битная часть \fIoffset\fP, соответственно. .SS "Исторические отличия между библиотекой C и ядром" Для учёта того, что значение \fBIOV_MAX\fP было мало в старых версиях Linux, обёрточные функции glibc \fBreadv\fP() и \fBwritev\fP() выполняют дополнительные действия, если обнаруживается, что используемый системный вызов ядра завершился неудачно из\-за превышения этого ограничения. В случае \fBreadv\fP(), обёрточная функция выделяет временный буфер, достаточный для всех элементов, указанных в \fIiov\fP, передаёт этот буфер в вызов \fBread\fP(2), копирует данные из буфера в места, указанные в полях \fIiov_base\fP элемента \fIiov\fP, а затем освобождает буфер. Обёрточная функция \fBwritev\fP() выполняет аналогичную задачу с помощью временного буфера и вызова \fBwrite\fP(2). .PP The need for this extra effort in the glibc wrapper functions went away with Linux 2.2 and later. However, glibc continued to provide this behavior until glibc 2.10. Starting with glibc 2.9, the wrapper functions provide this behavior only if the library detects that the system is running a Linux kernel older than Linux 2.6.18 (an arbitrarily selected kernel version). And since glibc 2.20 (which requires a minimum of Linux 2.6.32), the glibc wrapper functions always just directly invoke the system calls. .SH ДЕФЕКТЫ .\" See .\" .\" The bug was introduced in .\" efa8480a831 fs: RWF_NOWAIT should imply IOCB_NOIO .\"and fixed in .\" 06c0444290 mm/filemap.c: generic_file_buffered_read() now uses find_get_pages_contig Linux 5.9 and Linux 5.10 have a bug where \fBpreadv2\fP() with the \fBRWF_NOWAIT\fP flag may return 0 even when not at end of file. .SH ПРИМЕРЫ Следующий пример кода демонстрирует использование \fBwritev\fP(): .PP .in +4n .EX char *str0 = "hello "; char *str1 = "world\en"; ssize_t nwritten; struct iovec iov[2]; iov[0].iov_base = str0; iov[0].iov_len = strlen(str0); iov[1].iov_base = str1; iov[1].iov_len = strlen(str1); nwritten = writev(STDOUT_FILENO, iov, 2); .EE .in .SH "СМ. ТАКЖЕ" \fBpread\fP(2), \fBread\fP(2), \fBwrite\fP(2) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Azamat Hackimov , Dmitriy S. Seregin , Katrin Kutepova , Lockal , Yuri Kozlov , Баринов Владимир и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .