.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2007, 2010 Michael Kerrisk .\" and Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" 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 "21 grudnia 2020 r." Linux "Podręcznik programisty Linuksa" .SH NAZWA readv, writev, preadv, pwritev, preadv2, pwritev2 \- read or write data into multiple buffers .SH SKŁADNIA .nf \fB#include \fP .PP \fBssize_t readv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP .PP \fBssize_t writev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP .PP \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 .PP \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 .PP \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 .PP \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 .PP .RS -4 Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)): .RE .PP \fBpreadv\fP(), \fBpwritev\fP(): Od glibc 2.19: _DEFAULT_SOURCE Glibc 2.19 i wcześniejsze: _BSD_SOURCE .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 ("rozrzucone wejście"). .PP Funkcja \fBwritev\fP() zapisuje co najwyżej \fIiovcnt\fP bloków opisanych przez \fIiov\fP do pliku skojarzonego z deskryptorem pliku \fIfd\fP ("zgromadzone wyjście"). .PP Wskaźnik \fIiov\fP prowadzi do struktury \fIiovec\fP zdefiniowanej w pliku \fI\fP następująco: .PP .in +4n .EX struct iovec { void *iov_base; /* Adres początkowy */ size_t iov_len; /* Liczba bajtów do przeniesienia */ }; .EE .in .PP Wywołanie systemowe \fBreadv\fP() działa tak samo jak \fBread\fP(2), z tą różnicą że wypełnianych jest wiele buforów. .PP 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. .PP Buffers are processed in array order. This means that \fBreadv\fP() completely fills \fIiov[0]\fP before proceeding to \fIiov[1]\fP, and so on. (If there is insufficient data, then not all buffers pointed to by \fIiov\fP may be filled.) Similarly, \fBwritev\fP() writes out the entire contents of \fIiov[0]\fP before proceeding to \fIiov[1]\fP, and so on. .PP .\" 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 (z jednym wyjątkiem, patrz \fBpipe\fP(7)). 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. .PP 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. .PP 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. .PP 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. .PP Argument \fIflags\fP zawiera bitowe LUB z jednej lub więcej z następujących flag: .TP \fBRWF_DSYNC\fP (since Linux 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 Provide a per\-write equivalent of the \fBO_DSYNC\fP \fBopen\fP(2) flag. This flag is meaningful only for \fBpwritev2\fP(), and its effect applies only to the data range written by the system call. .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 z\ flagą \fBO_DIRECT\fP). .TP \fBRWF_SYNC\fP (since Linux 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 Provide a per\-write equivalent of the \fBO_SYNC\fP \fBopen\fP(2) flag. This flag is meaningful only for \fBpwritev2\fP(), and its effect applies only to the data range written by the system call. .TP \fBRWF_NOWAIT\fP (since Linux 4.14) .\" commit 3239d834847627b6634a4139cf1dc58f6f137a46 .\" commit 91f9943e1c7b6638f27312d03fe71fcc67b23571 Do not wait for data which is not immediately available. If this flag is specified, the \fBpreadv2\fP() system call will return instantly if it would have to read data from the backing storage or wait for a lock. If some data was successfully read, it will return the number of bytes read. If no bytes were read, it will return \-1 and set \fIerrno\fP to \fBEAGAIN\fP. Currently, this flag is meaningful only for \fBpreadv2\fP(). .TP \fBRWF_APPEND\fP (since Linux 4.16) .\" commit e1fc742e14e01d84d9693c4aca4ab23da65811fb Provide a per\-write equivalent of the \fBO_APPEND\fP \fBopen\fP(2) flag. This flag is meaningful only for \fBpwritev2\fP(), and its effect applies only to the data range written by the system call. The \fIoffset\fP argument does not affect the write operation; the data is always appended to the end of the file. However, if the \fIoffset\fP argument is \-1, the current file offset is updated. .SH "WARTOŚĆ ZWRACANA" On success, \fBreadv\fP(), \fBpreadv\fP(), and \fBpreadv2\fP() return the number of bytes read; \fBwritev\fP(), \fBpwritev\fP(), and \fBpwritev2\fP() return the number of bytes written. .PP Note that it is not an error for a successful call to transfer fewer bytes than requested (see \fBread\fP(2) and \fBwrite\fP(2)). .PP W razie wystąpienia błędu zwracane jest \-1 i ustawiana jest odpowiednia wartość zmiennej \fIerrno\fP. .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 \fBpreadv\fP() i \fBpwritev\fP() po raz pierwszy pojawiły się w Linuksie 2.6.30; wsparcie biblioteczne tych wywołań pojawiło się w glibc 2.10. .PP \fBpreadv2\fP() and \fBpwritev2\fP() first appeared in Linux 4.6. Library support was added in glibc 2.26. .SH "ZGODNE Z" .\" 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.) \fBreadv\fP(), \fBwritev\fP(): POSIX.1\-2001, POSIX.1\-2008, 4.4BSD (wywołania te początkowo pojawiły się w BSD 4.2). .PP \fBpreadv\fP(), \fBpwritev\fP(): niestandardowe, ale obecne także w nowoczesnych systemach BSD. .PP \fBpreadv2\fP(), \fBpwritev2\fP(): niestandardowe rozszerzenie systemu Linux. .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. .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: .PP \fB unsigned long \fP\fIpos_l\fP\fB, unsigned long \fP\fIpos\fP .PP Argumenty te zawierają 32 bitowy \fIoffset\fP w kolejności odpowiednio, od najmniej i od najbardziej znaczącego bitu. .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). .PP Potrzeba tych dodatkowych działań funkcji opakowujących glibc przestała być\ potrzebna od Linuksa 2.2. Jednak glibc wciąż udostępniał\ to działanie do wersji 2.10. Poczynając od wersji 2.9 glibc, 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ż 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 PRZYKŁADY Następujący przykładowy kod pokazuje użycie funkcji \fBwritev\fP(): .PP .in +4n .EX char *str0 = "witaj "; char *str1 = "świecie\en"; struct iovec iov[2]; ssize_t nwritten; 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) .SH "O STRONIE" Angielska wersja tej strony pochodzi z wydania 5.10 projektu Linux \fIman\-pages\fP. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem \%https://www.kernel.org/doc/man\-pages/. .SH TŁUMACZENIE Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Robert Luberda i Michał Kułach . 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. Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres .MT manpages-pl-list@lists.sourceforge.net .ME .