.\" -*- coding: UTF-8 -*-
.\" Copyright (C) 2007, 2010 Michael Kerrisk <mtk.manpages@gmail.com>
.\" 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 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.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 <sys/uio.h>\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.
.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
Liczba \fIiovcnt\fP wektorów jest mniejsza niż zero lub większa niż
dopuszczalne maksimum.
.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\-2008.
.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 \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.)
POSIX.1\-2001, 4.4BSD (pojawiło się pierwotnie w 4.2BSD).
.P
\fBpreadv\fP(), \fBpwritev\fP(): Linux 2.6.30, glibc 2.10.
.P
\fBpreadv2\fP(), \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<limits.h>\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
.\" <https://lore.kernel.org/linux-fsdevel/fea8b16d-5a69-40f9-b123-e84dcd6e8f2e@www.fastmail.com/T/#u>
.\" 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
Autorami polskiego tłumaczenia niniejszej strony podręcznika są:
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>
.
.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 .
