.\" -*- coding: UTF-8 -*- .\"This manpage is Copyright (C) 2015 Anna Schumaker .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH copy_file_range 2 "15 июня 2024 г." "Справочные страницы Linux 6.9.1" .SH НАИМЕНОВАНИЕ copy_file_range \- копирует часть данных из одного файла в другой .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP, \fI\-lc\fP) .SH ОБЗОР .nf \fB#define _GNU_SOURCE\fP \fB#define _FILE_OFFSET_BITS 64\fP \fB#include \fP .P \fBssize_t copy_file_range(int \fP\fIfd_in\fP\fB, off_t *_Nullable \fP\fIoff_in\fP\fB,\fP \fB int \fP\fIfd_out\fP\fB, off_t *_Nullable \fP\fIoff_out\fP\fB,\fP \fB size_t \fP\fIlen\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP .fi .SH ОПИСАНИЕ Системный вызов \fBcopy_file_range\fP() выполняет внутриядерное копирование между двумя файловыми дескрипторами без дополнительных накладных расходов по передаче данных из ядра в пользовательское пространство и затем обратно в ядро. Он копирует до \fIlen\fP байт данных из файлового дескриптора \fIfd_in\fP источника в файловый дескриптор \fIfd_out\fP приёмника, перезаписывая существующие данные внутри запрашиваемой области файла назначения. .P Следующая семантика применяется к \fIoff_in\fP и подобная ей к \fIoff_out\fP: .IP \[bu] 3 Если \fIoff_in\fP равно NULL, то байты читаются из \fIfd_in\fP начиная с файлового смещения, а файловое смещение корректируется на количество скопированных байт. .IP \[bu] Если \fIoff_in\fP не равно NULL, то \fIoff_in\fP должно указывать на буфер, задающий начальное смещение в \fIfd_in\fP, из которого будут читаться байты. Файловое смещение \fIfd_in\fP не изменяется, но \fIoff_in\fP изменяется соответствующим образом. .P Значения \fIfd_in\fP и \fIfd_out\fP могут ссылаться на один и тот же файл. Если это так, то диапазонам источника и приёмника нельзя перекрываться. .P Аргумент \fIflags\fP предназначен для будущих расширений, а пока его значение должно быть равно 0. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBcopy_file_range\fP() возвращает количество скопированных между файлами байт. Оно может быть меньше запрашиваемой длины. Если файловое смещение \fIfd_in\fP в конце или за концом файла, то байты не копирются и \fBcopy_file_range\fP() возвращает ноль. .P В случае ошибки \fBcopy_file_range\fP() возвращает \-1, а \fIerrno\fP устанавливается в соответствующее значение. .SH ОШИБКИ .TP \fBEBADF\fP Один или оба файловых дескриптора недействительны. .TP \fBEBADF\fP Дескриптор \fIfd_in\fP не открыт на чтение или дескриптор \fIfd_out\fP не открыт на запись. .TP \fBEBADF\fP В открытом файловом описании, на которое ссылается файловый дескриптор \fIfd_out\fP, установлен флаг \fBO_APPEND\fP (смотрите \fBopen\fP(2)). .TP \fBEFBIG\fP Попытка записать в позицию вне максимально поддерживаемого ядром файлового смещения. .TP \fBEFBIG\fP Попытка записи диапазона, который превышает разрешённый максимальный размер файла. Максимальный размер файла различается в реализациях файловых систем и может отличаться от разрешённого максимального файлового смещения. .TP \fBEFBIG\fP Попытка записи, выходящее за ограничение ресурса процесса на размер файла. Также это может вызвать получение процессом сигнала \fBSIGXFSZ\fP. .TP \fBEINVAL\fP Аргумент \fIflags\fP не равен 0. .TP \fBEINVAL\fP Значения \fIfd_in\fP и \fIfd_out\fP ссылаются на один и тот же файл и диапазоны источника и приёмника перекрываются. .TP \fBEINVAL\fP Значение \fIfd_in\fP или \fIfd_out\fP указывает на необычный файл. .TP \fBEIO\fP Во время копирования возникла низкоуровневая ошибка ввода\-вывода. .TP \fBEISDIR\fP Значение \fIfd_in\fP или \fIfd_out\fP указывает на каталог. .TP \fBENOMEM\fP Не хватает памяти. .TP \fBENOSPC\fP Недостаточно места на файловой системе назначения для завершения копирования. .TP \fBEOPNOTSUPP\fP (начиная с Linux 5.19) .\" commit 868f9f2f8e004bfe0d3935b1976f625b2924893b Файловая система не поддерживает эту операцию. .TP \fBEOVERFLOW\fP Запрошенный диапазон источника и приёмника слишком большой для представления в указанном типе данных. .TP \fBEPERM\fP Значение \fIfd_out\fP ссылается на файл с постоянными данными (immutable). .TP \fBETXTBSY\fP Значение \fIfd_in\fP или \fIfd_out\fP указывает на активный файл подкачки. .TP \fBEXDEV\fP (до Linux 5.3) .\" commit 5dae222a5ff0c269730393018a5539cc970a4726 The files referred to by \fIfd_in\fP and \fIfd_out\fP are not on the same filesystem. .TP \fBEXDEV\fP (начиная с Linux 5.19) .\" commit 868f9f2f8e004bfe0d3935b1976f625b2924893b The files referred to by \fIfd_in\fP and \fIfd_out\fP are not on the same filesystem, and the source and target filesystems are not of the same type, or do not support cross\-filesystem copy. .SH ВЕРСИИ A major rework of the kernel implementation occurred in Linux 5.3. Areas of the API that weren't clearly defined were clarified and the API bounds are much more strictly checked than on earlier kernels. .P Since Linux 5.19, cross\-filesystem copies can be achieved when both filesystems are of the same type, and that filesystem implements support for it. See BUGS for behavior prior to Linux 5.19. .P Приложения должны ориентироваться на поведение и требования Linux 5.19, который также был перенесен в более ранние стабильные ядра. .SH СТАНДАРТЫ Linux, GNU. .SH ИСТОРИЯ .\" https://sourceware.org/git/?p=glibc.git;a=commit;f=posix/unistd.h;h=bad7a0c81f501fbbcc79af9eaa4b8254441c4a1f Linux 4.5, but glibc 2.27 provides a user\-space emulation when it is not available. .SH ПРИМЕЧАНИЯ Если файл \fIfd_in\fP является разреженным (sparse), то \fBcopy_file_range\fP() может расширить дыры, существующие в запрашиваемой области. Пользователи могут получить преимущество от вызова \fBcopy_file_range\fP() в цикле, и используя операции \fBlseek\fP(2) \fBSEEK_DATA\fP и \fBSEEK_HOLE\fP для поиска расположений сегментов данных. .P Вызов \fBcopy_file_range\fP() даёт файловым системам возможность реализовать «ускорение копирования», например, использовать ссылочные связи (т. е., две или более инод, использующих общие указатели для одного копирования\-при\-записи дисковых блоков) или копирование\-на\-сервере (server\-side\-copy, в случае использования NFS). .P \fB_FILE_OFFSET_BITS\fP should be defined to be 64 in code that uses non\-null \fIoff_in\fP or \fIoff_out\fP or that takes the address of \fBcopy_file_range\fP, if the code is intended to be portable to traditional 32\-bit x86 and ARM platforms where \fBoff_t\fP's width defaults to 32 bits. .SH ОШИБКИ In Linux 5.3 to Linux 5.18, cross\-filesystem copies were implemented by the kernel, if the operation was not supported by individual filesystems. However, on some virtual filesystems, the call failed to copy, while still reporting success. .SH ПРИМЕРЫ .\" SRC BEGIN (copy_file_range.c) .EX #define _GNU_SOURCE #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include \& int main(int argc, char *argv[]) { int fd_in, fd_out; off_t len, ret; struct stat stat; \& if (argc != 3) { fprintf(stderr, "Usage: %s \[rs]n", argv[0]); exit(EXIT_FAILURE); } \& fd_in = open(argv[1], O_RDONLY); if (fd_in == \-1) { perror("open (argv[1])"); exit(EXIT_FAILURE); } \& if (fstat(fd_in, &stat) == \-1) { perror("fstat"); exit(EXIT_FAILURE); } \& len = stat.st_size; \& fd_out = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644); if (fd_out == \-1) { perror("open (argv[2])"); exit(EXIT_FAILURE); } \& do { ret = copy_file_range(fd_in, NULL, fd_out, NULL, len, 0); if (ret == \-1) { perror("copy_file_range"); exit(EXIT_FAILURE); } \& len \-= ret; } while (len > 0 && ret > 0); \& close(fd_in); close(fd_out); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "СМОТРИТЕ ТАКЖЕ" \fBlseek\fP(2), \fBsendfile\fP(2), \fBsplice\fP(2) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , Katrin Kutepova , Yuri Kozlov , Иван Павлов и Kirill Rekhov . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .