.\" -*- coding: UTF-8 -*- .\" Copyright 2015, Anna Schumaker .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH copy_file_range 2 "8 lutego 2026 r." "Linux man\-pages 6.18" .SH NAZWA copy_file_range \- kopiuje zakres danych z jednego pliku do drugiego .SH BIBLIOTEKA Standardowa biblioteka C (\fIlibc\fP,\ \fI\-lc\fP) .SH SKŁADNIA .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\fIsize\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP .fi .SH OPIS Wywołanie systemowe \fBcopy_file_range\fP() przeprowadza kopiowanie wewnątrz jądra pomiędzy dwoma deskryptorami plików, bez dodatkowego kosztu transferu danych z jądro do przestrzeni użytkownika, a następnie z powrotem do jądra. Kopiuje maksymalnie \fIsize\fP bajtów danych ze źródłowego deskryptora pliku \fIfd_in\fP do docelowego deskryptora pliku \fIfd_out\fP, nadpisując wszelkie dane, które istniały w żądanym zakresie pliku docelowego. .P \fIoff_in\fP jest objęte następującą semantyką i podobne stwierdzenia odnoszą się do \fIoff_out\fP: .IP \[bu] 3 Jeśli \fIoff_in\fP wynosi NULL, to bajty są odczytywane z \fIfd_in\fP począwszy od przesunięcia pliku, a przesunięcie pliku jest dostosowywane o liczbę skopiowanych bajtów. .IP \[bu] Jeśli \fIoff_in\fP nie wynosi NULL, to \fIoff_in\fP musi wskazywać na bufor określający początkowe przesunięcie, od którego zostaną odczytane bajty z \fIfd_in\fP. Przesunięcie pliku \fIfd_in\fP nie jest zmieniane, ale \fIoff_in\fP jest odpowiednio dostosowywane. .P \fIfd_in\fP i \fIfd_out\fP mogą odnosić się do tego samego pliku. Jeśli odnoszą się do tego samego pliku, to zakres źródłowy i docelowy nie mogą na siebie nachodzić. .P Argument \fIflags\fP jest przeznaczony na przyszłe rozszerzenia i obecnie musi być ustawiony na 0. .SH "WARTOŚĆ ZWRACANA" Po pomyślnym zakończeniu, \fBcopy_file_range\fP() zwróci liczbę bajtów skopiowanych pomiędzy dwoma plikami. Może być to rozmiar mniejszy od pierwotnie żądanego. Jeśli przesunięcie pliku \fIfd_in\fP znajduje się na końcu, lub za końcem, pliku, to nie są kopiowane żadne bajty, a \fBcopy_file_range\fP() zwraca zero. .P W razie wystąpienia błędu \fBcopy_file_range\fP zwraca \-1 i ustawia \fIerrno\fP, wskazując błąd. .SH BŁĘDY .TP \fBEBADF\fP Jeden lub więcej deskryptorów plików nie jest prawidłowych. .TP \fBEBADF\fP \fIfd_in\fP nie jest otwarty do odczytu; albo \fIfd_out\fP nie jest otwarty do zapisu. .TP \fBEBADF\fP Znacznik \fBO_APPEND\fP jest ustawiony na opis otwartego pliku (ODF, zob. \fBopen\fP(2)), do którego odnosi się deskryptor pliku \fIfd_out\fP. .TP \fBEFBIG\fP Podjęto próbę zapisu w pozycji poza maksymalnym przesunięciem pliku obsługiwanym przez jądro. .TP \fBEFBIG\fP Podjęto próbę zapisu zakresu, który przekracza maksymalny dopuszczalny rozmiar pliku. Maksymalny rozmiar pliku różni się pomiędzy implementacjami systemów plików i może być inny niż maksymalne dopuszczalne przesunięcie pliku. .TP \fBEFBIG\fP Podjęto próbę zapisu poza limit zasobu procesu dotyczący rozmiaru pliku. Może to też spowodować otrzymanie przez proces sygnału \fBSIGXFSZ\fP. .TP \fBEINVAL\fP Argument \fIflags\fP nie wynosi 0. .TP \fBEINVAL\fP \fIfd_in\fP i \fIfd_out\fP odnoszą się do tego samego pliku, a źródłowy i docelowy zakres nachodzą na siebie. .TP \fBEINVAL\fP \fIfd_in\fP albo \fIfd_out\fP nie jest zwykłym plikiem. .TP \fBEIO\fP Przy kopiowaniu wystąpił niskopoziomowy błąd wejścia/wyjścia. .TP \fBEISDIR\fP \fIfd_in\fP albo \fIfd_out\fP odnoszą się do katalogu. .TP \fBENOMEM\fP Brak pamięci. .TP \fBENOSPC\fP Na docelowym systemie plików nie ma wystarczająco dużo miejsca, aby ukończyć kopiowanie. .TP \fBEOPNOTSUPP\fP (od Linuksa 5.19) .\" commit 868f9f2f8e004bfe0d3935b1976f625b2924893b System plików nie obsługuje tej operacji. .TP \fBEOVERFLOW\fP Żądany zakres źródłowy lub docelowy jest zbyt duży, aby dało się go przedstawić w podanych typach danych. .TP \fBEPERM\fP \fIfd_out\fP odnosi się do niezmiennego pliku (ang. immutable). .TP \fBETXTBSY\fP \fIfd_in\fP albo \fIfd_out\fP odnoszą się do aktywnego pliku wymiany. .TP \fBEXDEV\fP (przed Linuksem 5.3) .\" commit 5dae222a5ff0c269730393018a5539cc970a4726 Pliki, do których odnoszą się \fIfd_in\fP i \fIfd_out\fP nie są położone w tym samym systemie plików. .TP \fBEXDEV\fP (od Linuksa 5.19) .\" commit 868f9f2f8e004bfe0d3935b1976f625b2924893b Pliki, do których odnoszą się \fIfd_in\fP i \fIfd_out\fP nie są położone w tym samym systemie plików, a źródłowy i docelowy system plików nie jest tego samego typu lub nie obsługuje kopii pomiędzy systemami plików. .SH WERSJE W Linuksie 5.3 doszło do znaczącej modyfikacji implementacji w jądrze. Jasno zdefiniowano miejsca w API, którym wcześniej tego brakowało, a granice API są znacznie ściślej sprawdzane, niż we wcześniejszych jądrach. .P Od Linuksa 5.19, możliwe jest kopiowanie pomiędzy systemami plików, jeśli oba są tego samego typu i dany system plików zaimplementował wsparcie tej operacji. W USTERKACH opisano zachowanie przed Linuksem 5.19. .P Aplikacje powinny dostosować się do zachowania i wymogów Linuksa 5.19, które zostało również przeportowane na wcześniejsze stabilne jądra. .SH STANDARDY Linux, GNU. .SH HISTORIA Linux 4.5. .P .\" glibc.git bad7a0c81f50 (2017-12-22; "copy_file_range: New function to copy file data") .\" glibc.git 5a659ccc0ec2 (2019-06-28; "io: Remove copy_file_range emulation [BZ #24744]") Przed glibc 2.30, zaczynając od glibc 2.27, funkcja opakowująca z glibc zapewniała zapasową implementację w przestrzeni użytkownika, gdy jądro nie obsługiwało tego wywołania systemowego. Od glibc 2.30 usunięto tę zapasową implementację; gdy jądro nie obsługuje \fBcopy_file_range\fP(), funkcja zawodzi teraz z błędem ENOSYS. .SH UWAGI Jeśli \fIfd_in\fP jest rzadkim (ang. sparse) plikiem, to \fBcopy_file_range\fP() może wykroczyć poza istniejące dziury w żądanym zakresie. Użytkownicy mogą zechcieć wywoływać \fBcopy_file_range\fP() w pętli, korzystając z operacji \fBSEEK_DATA\fP i \fBSEEK_HOLE\fP wywołania \fBlseek\fP(2), aby odnaleźć położenie segmentów danych. .P \fBcopy_file_range\fP() daje systemom plików sposobność na implementację technik \[Bq]przyspieszonego kopiowania\[rq], takich jak korzystanie z dowiązań lekkich (reflinków tj. dwóch lub więcej i\-węzłów, które dzielą wskaźniki do tych samych bloków dyskowych kopii przy zapisie) lub kopiowania po stronie serwera (w przypadku NFS). .P \fB_FILE_OFFSET_BITS\fP powinno być zdefiniowane jako 64 w kodzie, który używa wartości \fIoff_in\fP lub \fIoff_out\fP innych niż null lub takim, który przyjmuje adres \fBcopy_file_range\fP, jeśli kod ma być przenośny na tradycyjne, 32\-bitowe platformy x86 i ARM, w których szerokość \fBoff_t\fP domyślnie wynosi 32 bity. .SH USTERKI W Linuksie 5.3 do Linuksa 5.18, kopie pomiędzy systemami plików były zaimplementowane w jądrze, jeśli operacja nie była obsługiwana przez poszczególne systemy plików. Jednak w niektórych wirtualnych systemach plików, kopiowanie się nie powodziło, a mimo to wywołanie wciąż zgłaszało sukces. .SH PRZYKŁADY .\" 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 size, ret; struct stat stat; \& if (argc != 3) { fprintf(stderr, "Użycie: %s <źródło> \[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); } \& size = 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, size, 0); if (ret == \-1) { perror("copy_file_range"); exit(EXIT_FAILURE); } \& size \-= ret; } while (size > 0 && ret > 0); \& close(fd_in); close(fd_out); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "ZOBACZ TAKŻE" \fBlseek\fP(2), \fBsendfile\fP(2), \fBsplice\fP(2) .PP .SH TŁUMACZENIE Tłumaczenie niniejszej strony podręcznika: Michał Kułach . .PP Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3 .UE lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. .PP Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej .MT manpages-pl-list@lists.sourceforge.net .ME .