.\" -*- coding: UTF-8 -*- .\" Copyright 1998, Pawel Krawczyk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-1-para .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH sendfile 2 "8 февраля 2026 г." "Справочные страницы Linux 6.17" .SH НАИМЕНОВАНИЕ sendfile \- производит обмен данными между дескрипторами файлов .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP,\ \fI\-lc\fP) .SH ОБЗОР .nf \fB#include \fP .P .\" The below is too ugly. Comments about glibc versions belong .\" in the notes, not in the header. .\" .\" .B #include .\" .B #if (__GLIBC__==2 && __GLIBC_MINOR__>=1) || __GLIBC__>2 .\" .B #include .\" #else .\" .B #include .\" .B /* No system prototype before glibc 2.1. */ .\" .BI "ssize_t sendfile(int" " out_fd" ", int" " in_fd" ", off_t *" \ .\" offset ", size_t" " count" ) .\" .B #endif .\" \fBssize_t sendfile(int\fP\fI out_fd\fP\fB, int\fP\fI in_fd\fP\fB, off_t *_Nullable \fP\fIoffset\fP\fB,\fP \fB size_t \fP\fIcount\fP\fB);\fP .fi .SH ОПИСАНИЕ Вызов \fBsendfile\fP() копирует данные из одного файлового дескриптора в другой. Так как копирование производится в ядре, использование \fBsendfile\fP() более эффективно чем комбинация \fBread\fP(2) и \fBwrite\fP(2), в которой требуется скопировать данные в и из пользовательского пространства. .P В \fIin_fd\fP должен указываться файловый дескриптор, открытый для чтения, а в \fIout_fd\fP должен указываться файловый дескриптор, открытый для записи. .P Если значение \fIoffset\fP не равно NULL, то оно указывает на переменную, содержащую файловое смещение с которого \fBsendfile\fP() начнёт чтение данных из \fIin_fd\fP. При завершении \fBsendfile\fP() значение этой переменной будет содержать смещение следующего байта после последнего прочитанного. Если значение \fIoffset\fP не равно NULL, то \fBsendfile\fP() не изменяет файловое смещение \fIin_fd\fP; иначе файловое смещение изменяется для отражения количества прочитанных из \fIin_fd\fP байт. .P Если значение \fIoffset\fP равно NULL, то данные будут прочитаны из \fIin_fd\fP начиная с файлового смещения, и по окончании работы вызова файловое смещение будет обновлено. .P В \fIcount\fP содержится количество байт, копируемых между файловыми дескрипторами. .P .\" commit b964bf53e540262f2d12672b3cca10842c0172e7 The \fIin_fd\fP argument must correspond to a file which supports \fBmmap\fP(2)\-like operations (i.e., it cannot be a socket). Except since Linux 5.12 and if \fIout_fd\fP is a pipe, in which case \fBsendfile\fP() desugars to a \fBsplice\fP(2) and its restrictions apply. .P Before Linux 2.6.33, \fIout_fd\fP must refer to a socket. Since Linux 2.6.33 it can be any file. If it's seekable, then \fBsendfile\fP() changes the file offset appropriately. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" Если пересылка прошла успешно, то возвращается количество записанных в \fIout_fd\fP байт. Заметим, что при успешном выполнении вызов \fBsendfile\fP() может записать меньше байт, чем запрашивалось; вызывающий должен быть готов повторить вызов, если останутся не отправленные байты. Также смотрите ЗАМЕЧАНИЯ. .P В случае ошибки возвращается \-1, а \fIerrno\fP устанавливается в значение ошибки. .SH ОШИБКИ .TP \fBEAGAIN\fP Был выбран неблокирующий ввод\-вывод с помощью \fBO_NONBLOCK\fP, но запись привела бы блокировке. .TP \fBEBADF\fP Входной файл не открыт для чтения или выходной файл не открыт для записи. .TP \fBEFAULT\fP Неправильный адрес. .TP \fBEINVAL\fP Неправильный или заблокированный дескриптор, или для \fIin_fd\fP недоступна операция типа \fBmmap\fP(2) или значение \fIcount\fP отрицательно. .TP \fBEINVAL\fP У \fIout_fd\fP установлен флаг \fBO_APPEND\fP. Пока это не поддерживается в \fBsendfile\fP(). .TP \fBEIO\fP Неизвестная ошибка при чтении \fIin_fd\fP. .TP \fBENOMEM\fP Не хватает памяти для чтения \fIin_fd\fP. .TP \fBEOVERFLOW\fP Значение \fIcount\fP слишком велико, операция вернула бы результат, превышающий максимальный размер входного или выходного файла. .TP \fBESPIPE\fP \fIoffset\fP is not NULL but the input file is not seekable. .SH ВЕРСИИ В других системах UNIX вызов \fBsendfile\fP() реализован с другими семантиками и прототипами. Не должен использоваться в переносимых программах. .SH СТАНДАРТЫ Отсутствуют. .SH ИСТОРИЯ Linux 2.2, glibc 2.1. .P В Linux 2.4 и более ранних, значение \fIout_fd\fP может также указывать на обычный файл; эта возможность была удалена в ядрах Linux 2.6.x, но возвращена в 2.6.33. .P Первоначальная версия Linux \fBsendfile\fP() не была приспособлена для работы с большими файловыми смещениями. В последствии в Linux 2.4 был добавлен вызов \fBsendfile64\fP() с более широким диапазоном значений аргумента \fIoffset\fP. В glibc \fBsendfile\fP() представляет собой обёрточную функцию, которая делает незаметным разницу между версиями ядер. .SH ПРИМЕЧАНИЯ .\" commit e28cc71572da38a5a12c1cfe4d7032017adccf69 Вызов \fBsendfile\fP() передаст не больше 0x7ffff000 (2 147 479 552) байт, возвращая число байт, переданных на самом деле (это утверждение справедливо как к 32\-битным, так и к 64\-битным системам). .P Если вы планируете использовать \fBsendfile\fP() для отправки файлов через сокет TCP и вам нужно послать некоторые заголовочные данные перед содержимым файла, то обратите внимание на параметр \fBTCP_CORK\fP, описанный в \fBtcp\fP(7), он поможет минимизировать количество пакетов и оптимизировать производительность. .P Applications may wish to fall back to \fBread\fP(2) and \fBwrite\fP(2) in the case where \fBsendfile\fP() fails with \fBEINVAL\fP or \fBENOSYS\fP. .P Если \fIout_fd\fP ссылается на сокет или канал с поддержкой нулевого копирования, то вызывающие должны гарантировать, что переданные части файла, указываемого \fIin_fd\fP, останутся неизменёнными до тех пор, пока читающий на другом конце \fIout_fd\fP не закончит обрабатывать переданные данные. .P Специальный вызов Linux \fBsplice\fP(2) поддерживает пересылку данных между произвольными файловыми дескрипторами, представляющими сокеты (один или оба). .SH "СМОТРИТЕ ТАКЖЕ" \fBcopy_file_range\fP(2), \fBmmap\fP(2), \fBopen\fP(2), \fBsocket\fP(2), \fBsplice\fP(2) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .