.\" -*- coding: UTF-8 -*- .\" Copyright 1993, Thomas Koenig .\" Copyright 2007-2010, Michael Kerrisk .\" 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 readv 2 "22 lutego 2026 r." "Linux man\-pages 6.18" .SH NAZWA readv, writev, preadv, pwritev, preadv2, pwritev2 \- czyta lub zapisuje dane do wielu buforów .SH BIBLIOTEKA Standardowa biblioteka C (\fIlibc\fP,\ \fI\-lc\fP) .SH SKŁADNIA .nf \fB#include \fP .P \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 .P \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 .P \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 .P .RS -4 Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)): .RE .P \fBpreadv\fP(), \fBpwritev\fP(): .nf Od glibc 2.19: _DEFAULT_SOURCE glibc 2.19 i wcześniejsze: _BSD_SOURCE .fi .SH OPIS Wywołanie systemowe \fBreadv\fP() czyta liczbę \fIiovcnt\fP bloków z pliku skojarzonego z deskryptorem pliku \fIfd\fP do wielu buforów opisanych przez \fIiov\fP (\[Bq]rozrzucone wejście\[rq]). .P Funkcja \fBwritev\fP() zapisuje co najwyżej \fIiovcnt\fP bloków opisanych przez \fIiov\fP do pliku skojarzonego z deskryptorem pliku \fIfd\fP (\[Bq]zgromadzone wyjście\[rq]). .P Wskaźnik \fIiov\fP prowadzi do struktury \fIiovec\fP, opisanej w \fBiovec\fP(3type). .P Wywołanie systemowe \fBreadv\fP() działa tak samo jak \fBread\fP(2), z tą różnicą że wypełnianych jest wiele buforów. .P Wywołanie systemowe \fBwritev\fP() działa tak samo jak \fBwrite\fP(2), z tą różnicą że zapisywane dane pochodzą z wielu buforów. .P Bufory są przetwarzane w porządku, w którym zostały wymienione w tablicy. Oznacza to, że \fBreadv\fP() całkowicie zapełni \fIiov[0]\fP zanim przejdzie do \fIiov[1]\fP itd. (jeśli jest za mało danych, to nie wszystkie bufory w \fIiov\fP zostaną wypełnione). Podobnie \fBwritev\fP zapisuje całkowicie zawartość \fIiov[0]\fP, zanim przejdzie do \fIiov[1]\fP, itd. .P .\" Regarding atomicity, see https://bugzilla.kernel.org/show_bug.cgi?id=10596 Transfery danych przeprowadzane przez \fBreadv\fP() i \fBwritev\fP() są atomowe: dane zapisywane przez \fBwritev\fP() są zapisywane jako pojedynczy blok danych, niekolidujący z danymi zapisywanymi przez inne procesy. Analogicznie \fBreadv\fP() gwarantuje przeczytanie sąsiadujących bloków danych, niezależnie od operacji odczytu przeprowadzanych przez inne wątki lub procesy mające deskryptory plików odnoszące się do tego samego otwartego pliku (patrz \fBopen\fP(2)). .SS "preadv() i pwritev()" Wywołanie systemowe \fBpreadv\fP() łączy w sobie funkcjonalności dostarczane przez \fBreadv\fP() i przez \fBpread\fP(2). Wykonuje to samo zadanie, co \fBreadv\fP(), ale dodaje czwarty argument, \fIoffset\fP, określający miejsce w pliku, w którym zostanie przeprowadzona operacja wejściowa. .P Wywołanie systemowe \fBpwritev\fP() łączy w sobie funkcjonalności dostarczane przez \fBwritev\fP() i przez \fBpwrite\fP(2). Wykonuje to samo zadanie, co \fBwritev\fP, ale dodaje czwarty argument, \fIoffset\fP, określający miejsce w pliku, w którym zostanie przeprowadzona operacja wyjściowa. .P Opisywane wywołania systemowe nie zmieniają pozycji przesunięcia w pliku. Pliki wskazywane przez \fIfd\fP muszą pozwalać na swobodny dostęp (przeszukiwanie). .SS "preadv2() i pwritev2()" Te wywołania systemowe są podobne do wywołań \fBpreadv\fP() i \fBpwritev\fP(), lecz dodają piąty argument \fIflags\fP, modyfikujący zachowanie w zależności od wywołania. .P W przeciwieństwie do \fBpreadv\fP() i \fBpwritev\fP(), jeśli argument \fIoffset\fP wynosi \-1, to używane i aktualizowane jest przesunięcie bieżącego pliku. .P Argument \fIflags\fP zawiera sumę bitową (OR) z jednego lub więcej z następujących znaczników: .TP \fBRWF_DSYNC\fP (od Linuksa 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 Udostępnia ekwiwalent znacznika \fBO_DSYNC\fP \fBopen\fP(2), tyle że do zapisu. Znacznik ten ma znaczenie jedynie dla \fBpwritev2\fP(), a jego efekty stosują się tylko w zakresie danych zapisanych przez wywołanie systemowe. .TP \fBRWF_HIPRI\fP (od Linuksa 4.6) Odczyt/zapis o wysokim priorytecie. Pozwala blokowym systemom plików na odpytywanie urządzenia, co zapewnia niższe opóźnienia, lecz może wymagać dodatkowych zasobów (obecnie ta funkcja nadaje się do użycia wyłącznie, jeśli deskryptor pliku otwarto ze znacznikiem \fBO_DIRECT\fP). .TP \fBRWF_SYNC\fP (od Linuksa 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 Udostępnia ekwiwalent znacznika \fBO_SYNC\fP \fBopen\fP(2), tyle że do zapisu. Znacznik ten ma znaczenie jedynie dla \fBpwritev2\fP(), a jego efekty stosują się tylko w zakresie danych zapisanych przez wywołanie systemowe. .TP \fBRWF_NOWAIT\fP (od Linuksa 4.14) .\" commit 3239d834847627b6634a4139cf1dc58f6f137a46 .\" commit 91f9943e1c7b6638f27312d03fe71fcc67b23571 Nie oczekuje na dane, które nie są natychmiast dostępne. Jeśli poda się ten znacznik, to wywołanie systemowe \fBpreadv2\fP() powróci natychmiast, jeśli miałoby musieć odczytywać dane z nośnika nieulotnego lub czekać na blokadę. Jeśli jakieś dane zostały pomyślnie odczytane, zwróci liczbę odczytanych bajtów. Jeśli nie odczytano żadnych danych, zwróci \-1 i ustawi \fIerrno\fP na \fBEAGAIN\fP (lecz zobacz \fBUSTERKI\fP). Obecnie, znacznik ten ma znaczenie jedynie dla \fBpreadv2\fP(). .TP \fBRWF_APPEND\fP (od Linuksa 4.16) .\" commit e1fc742e14e01d84d9693c4aca4ab23da65811fb Udostępnia ekwiwalent znacznika \fBO_APPEND\fP \fBopen\fP(2), tyle że do zapisu. Znacznik ten ma znaczenie jedynie dla \fBpwritev2\fP(), a jego efekty stosują się tylko w zakresie danych zapisanych przez wywołanie systemowe. Argument \fIoffset\fP nie wpływa na operację zapisu; dane są zawsze dopisywane do końca pliku. Jednakże, jeśli argument \fIoffset\fP wynosi \-1, bieżące przesunięcie pliku jest uaktualniane. .TP \fBRWF_NOAPPEND\fP (od Linuksa 6.9) Nie honoruje znacznika \fBO_APPEND\fP \fBopen\fP(2). Znacznik ten jest istotny tylko dla \fBpwritev2\fP(). Historycznie, Linux uwzględniał znacznik \fBO_APPEND\fP, jeśli był ustawiony, i ignorował argument przesunięcia, co jest błędem. W przypadku \fBpwritev2\fP(), jeśli znacznik \fBRWF_NOAPPEND\fP jest ustawiony, argument \fIoffset\fP jest honorowany zgodnie z przewidywaniami, czyli tak samo, jak gdyby znacznik \fBO_APPEND\fP nie był ustawiony. .TP \fBRWF_ATOMIC\fP (od Linuksa 6.11) Wymaga, aby zapisy do zwykłych plików w systemie plików korzystającym z bloków, były wydawane z zabezpieczeniem przed rozdartym zapisem (ang. torn\-write). Zabezpieczenie przed rozdartym zapisem oznacza, że w przypadku usterki zasilania lub dowolnej innej usterki sprzętowej zostaną zapisane albo wszystkie, albo żadne dane z zapisu, jednak nigdy nie będzie do mieszanina starych i nowych danych. Znacznik ten jest istotny tylko dla \fBpwritev2\fP(), a jego skutki dotyczą tylko danych zapisywanych przez to wywołanie systemowe. Całkowita długość zapisu musi być potęgą dwójki i musi mieścić się w przedziale [\fIstx_atomic_write_unit_min\fP, \fIstx_atomic_write_unit_max\fP]. Zapis musi być w naturalnie dopasowanym przesunięciu w pliku, z uwzględnieniem całkowitej długości zapisu. Na przykład zapis o długości 32KiB na przesunięciu 32KiB w pliku jest dozwolony, natomiast zapis o długości 32KiB na przesunięciu 48KiB już nie. Górną granicę \fIiovcnt\fP dla \fBpwritev2\fP() określa wartość w \fIstx_atomic_write_segments_max\fP. Zabezpieczenie przed rozdartym zapisem działa tylko ze znacznikiem \fBO_DIRECT\fP, tj. zapisy buforowane nie są obsługiwane. Aby zagwarantować spójność zapisu pomiędzy wewnętrznym stanem pliku a tym na urządzeniu dyskowym, konieczne jest podanie \fBO_SYNC\fP lub \fBO_DSYNC\fP przy \fBopen\fP(2). Taka sama gwarancja zsynchronizowanego wejścia/wyjście jak opisana w \fBopen\fP(2) jest zapewniana, gdy używane są te znaczniki, albo ich odpowiedniki, oraz wywołania systemowe (np. gdy podano \fBRWF_SYNC\fP dla \fBpwritev2\fP()). .TP \fBRWF_DONTCACHE\fP (od Linuksa 6.14) Odczyty lub zapisy do zwykłego pliku wyczyszczą zawartość utworzonego bufora strony po zakończeniu operacji. Różni się to od zwykłego buforowanego wejścia/wyjścia, gdzie dane zwykle pozostają w buforze do momentu, gdy zostanie on odzyskany ze względu na potrzebną pamięć. Jeśli dane zakresy odczytywanego lub zapisywanego wejścia/wyjścia już znajdowały się w buforze przed tym odczytem lub zapisem, to nie zostaną one wyczyszczone po zakończeniu operacji wejścia/wyjścia. .IP Dodatkowo, wszelkie zakresy zmodyfikowane (dirty) przez operację zapisu z ustawionym \fBRWF_DONTCACHE\fP zostaną przeznaczone do zapisu zwrotnego. Jest to podobne do wywołania \fBsync_file_range\fP(2) z \fISYNC_FILE_RANGE_WRITE\fP w celu rozpoczęcia zapisu zwrotnego zadanego zakresu. \fBRWF_DONTCACHE\fP jest wskazówką, wobec której, pomimo próby jej spełnienia, nie istnieje gwarancja co do stanu bufora strony po zakończeniu operacji. .IP Przy użyciu w systemie plików lub na urządzeniu blokowym, który go nie obsługuje, zwróci \-1 i spowoduje ustawienie \fIerrno\fP na \fBEOPNOTSUPP\fP. .SH "WARTOŚĆ ZWRACANA" Gdy się powiodą, funkcje \fBreadv\fP(), \fBpreadv\fP() i \fBpreadv2\fP() zwracają liczbę przeczytanych bajtów, a funkcje \fBwritev\fP(), \fBpwritev\fP() i \fBpwritev2\fP() zwracają liczbę bajtów zapisanych. .P Proszę zauważyć, że nie jest błędem przesłanie mniejszej liczby bajtów niż żądano przez poprawne wywołanie (zob. \fBread\fP(2) i \fBwrite\fP(2)). .P W razie wystąpienia błędu zwracane jest \-1 i ustawiane \fIerrno\fP wskazując błąd. .SH BŁĘDY Zwracane błędy są takie same, jak w przypadku funkcji \fBread\fP(2) i \fBwrite\fP(2). Ponadto \fBpreadv\fP(), \fBpreadv2\fP(), \fBpwritev\fP() i \fBpwritev2\fP() mogą także zwrócić błędy takie jak w przypadku \fBlseek\fP(2). Dodatkowo zdefiniowane są następujące błędy: .TP \fBEINVAL\fP Suma wartości \fIiov_len\fP przekracza rozmiar \fIssize_t\fP. .TP \fBEINVAL\fP Jeśli podano \fBRWF_ATOMIC\fP, połączenie sumy wartości \fIiov_len\fP i wartości \fIoffset\fP nie jest zgodne z regułami określonymi dla długości i przesunięcia, przy stosowaniu zabezpieczenia przed rozdartym zapisem (ang. torn\-write). .TP \fBEINVAL\fP Liczba \fIiovcnt\fP wektorów wynosi mniej niż zero lub jest większa od dozwolonego maksimum. Jeśli podano \fBRWF_ATOMIC\fP, maksimum wynika z wartości \fIstx_atomic_write_segments_max\fP ze \fIstatx\fP. .TP \fBEOPNOTSUPP\fP We \fIflags\fP ustawiono \fBRWF_DONTCACHE\fP, a plik tego nie obsługiwał. .TP \fBEOPNOTSUPP\fP Jako \fIflags\fP podano nieznaną flagę. .SH WERSJE .SS "Różnice biblioteki C/jądra" Surowe wywołania systemowe \fBpreadv\fP() i \fBpwritev\fP() mają sygnatury wywołań różniące się subtelnie od odpowiadających im w funkcji opakowującej biblioteki GNU C pokazanych w SKŁADNI. Ostatni argument \fIoffset\fP, jest rozpakowany przez funkcję opakowującą na dwa argumenty wywołania systemowego: .P \fB unsigned long \fP\fIpos_l\fP\fB, unsigned long \fP\fIpos\fP .P Argumenty te zawierają 32 bitowy \fIoffset\fP w kolejności odpowiednio, od najmniej i od najbardziej znaczącego bitu. .SH STANDARDY .TP \fBreadv\fP() .TQ \fBwritev\fP() POSIX.1\-2024. .TP \fBpreadv\fP() .TQ \fBpwritev\fP() BSD. .TP \fBpreadv2\fP() .TQ \fBpwritev2\fP() Linux. .SH HISTORIA .TP \fBreadv\fP() .TQ \fBwritev\fP() .\" Linux libc5 used .\" .I size_t .\" as the type of the .\" .I iovcnt .\" argument, .\" and .\" .I int .\" as the return type. .\" The readv/writev system calls were buggy before Linux 1.3.40. .\" (Says release.libc.) POSIX.1\-2001, 4.4BSD (pojawiło się pierwotnie w 4.2BSD). .TP \fBpreadv\fP() .TQ \fBpwritev\fP() Linux 2.6.30, glibc 2.10. .TP \fBpreadv2\fP() .TQ \fBpwritev2\fP() Linux 4.6, glibc 2.26. .SS "Historyczne różnice biblioteki C/jądra" Aby rozwiązać sytuację, gdy \fIIOV_MAX\fP było tak niskie we wczesnych wersjach Linuksa, funkcje opakowujące \fBreadv\fP() i \fBwritev\fP() wykonywały pewne dodatkowe działania po wykryciu, że odpowiednie wywołanie systemowe zakończyło się błędem z powodu przekroczenia limitu. W takim wypadku funkcja \fBreadv\fP() biblioteki glibc przydzielała tymczasowy bufor, wystarczająco duży, by pomieścić wszystkie elementy określone przez \fIiov\fP, przekazywała ten bufor wywołaniu systemowemu \fBread\fP(2), kopiowała dane z bufora tymczasowego do lokalizacji określonych przez \fIiov\fP, a następnie zwalniała pamięć bufora. Funkcja glibc dla \fBwritev\fP() wykonywała analogiczne zadanie, używając bufora tymczasowego i wywołania funkcji \fBwrite\fP(2). .P Potrzeba tych dodatkowych działań funkcji opakowujących glibc przestała istnieć od Linuksa 2.2. Jednak glibc wciąż udostępniał to zachowanie do glibc 2.10. Poczynając od wersji glibc 2.9, funkcje opakowujące wykonywały to działanie tylko jeśli biblioteka wykryła, że system działa pod kontrolą jądra Linux starszego niż Linux 2.6.18 (wybór tej wersji jądra nie ma głębszej przyczyny). Od glibc 2.10 (wymagającej co najmniej Linuksa 2.6.32) funkcje opakowujące glibc bezpośrednio przywołują wywołania systemowe. .SH UWAGI .\" .\" POSIX.1 pozwala w implementacji umieścić ograniczenie liczby argumentów, które mogą być przekazane w \fIiov\fP. Implementacja może rozgłosić ten limit definiując \fBIOV_MAX\fP w \fI\fP lub w czasie uruchomienia, zwracaną wartością z \fIsysconf(_SC_IOV_MAX)\fP. Na współczesnych systemach Linux limit ten wynosi 1024. W czasach Linuksa 2.0 wynosił 16. .SH USTERKI .\" 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 i Linux 5.10 są obarczone błędem: \fBpreadv2\fP() ze znacznikiem \fBRWF_NOWAIT\fP może zwrócić 0 nawet, gdy nie jest to koniec pliku. .SH PRZYKŁADY Następujący przykładowy kod pokazuje użycie funkcji \fBwritev\fP(): .P .in +4n .EX char *str0 = "witaj "; char *str1 = "świecie\[rs]n"; 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 "ZOBACZ TAKŻE" \fBpread\fP(2), \fBread\fP(2), \fBwrite\fP(2) .PP .SH TŁUMACZENIE Tłumaczenie niniejszej strony podręcznika: Robert Luberda i 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 .