1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
|
.\" Copyright (C) 2007, 2010 Michael Kerrisk <mtk.manpages@gmail.com>
.\" 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.
.\"
.\"*******************************************************************
.\" This file is distributed under the same license as original manpage
.\" Copyright of the original manpage:
.\" Copyright © 1993 Thomas Koenig, 2007,2010 Michael Kerrisk
.\" Copyright © of Polish translation:
.\" Robert Luberda <robert@debian.org>, 2006, 2012.
.\" Michał Kułach <michal.kulach@gmail.com>, 2013, 2014, 2016.
.TH READV 2 2016\-03\-15 Linux "Podręcznik programisty Linuksa"
.SH NAZWA
readv, writev, preadv, pwritev \- czytanie lub zapisywanie danych do wielu
buforów
.SH SKŁADNIA
.nf
\fB#include <sys/uio.h>\fP
.sp
\fBssize_t readv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP
.sp
\fBssize_t writev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP
.sp
\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
.sp
\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
.sp
\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
.sp
\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
.sp
.in -4n
Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)):
.in
.sp
\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<sys/uio.h>\fP następująco:
.PP
.br
.in +4n
.nf
struct iovec {
void *iov_base; /* Adres początkowy */
size_t iov_len; /* Liczba bajtów do przeniesienia */
};
.fi
.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
Bufory są przetwarzane w porządku, w którym zostały wymienione w
tablicy. Oznacza to, że \fBreadv\fP() całkowicie zapełni \fIiov\fP[0] zanim
przejdzie do \fIiov\fP[1] 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\fP[0], zanim przejdzie do \fIiov\fP[1], itd.
.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.
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.
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.
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.
Argument \fIflags\fP zawiera bitowe LUB z jednej lub więcej z następujących
flag:
.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).
.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.
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)).
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
\fBEINVAL\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.
\fBpreadv2\fP() i \fBpwritev2\fP() po raz pierwszy pojawiły się w Linuksie 4.6.
.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).
\fBpreadv\fP(), \fBpwritev\fP(): niestandardowe, ale obecne także w nowoczesnych
systemach BSD.
.sp
\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<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.
.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:
\fB unsigned long \fP\fIpos_l\fP\fB, unsigned long \fP\fIpos\fP
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).
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.
Nie jest zalecane mieszanie wywołań funkcji operujących na deskryptorach
plików, takich jak \fBreadv\fP() czy \fBwritev\fP(), z funkcjami biblioteki stdio;
rezultaty takiego mieszania nie są określone i najprawdopodobniej nie będą
zgodne z oczekiwaniami.
.SH PRZYKŁAD
Następujący przykładowy kod pokazuje użycie funkcji \fBwritev\fP():
.in +4n
.nf
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);
.fi
.in
.SH "ZOBACZ TAKŻE"
\fBpread\fP(2), \fBread\fP(2), \fBwrite\fP(2)
.SH "O STRONIE"
Angielska wersja tej strony pochodzi z wydania 4.07 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 man są:
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>.
.PP
Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją \fB 4.07 \fPoryginału.
|