Provided by: manpages-pl-dev_0.6-2_all bug

NAZWA

       readv, writev, preadv, pwritev - czytanie lub zapisywanie danych do wielu buforów

SKŁADNIA

       #include <sys/uio.h>

       ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

       ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

       ssize_t preadv(int fd, const struct iovec *iov, int iovcnt,
                      off_t offset);

       ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,
                       off_t offset);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       preadv(), pwritev(): _BSD_SOURCE

OPIS

       Wywołanie  systemowe  readv()  czyta liczbę iovcnt bloków z pliku skojarzonego z deskryptorem pliku fd do
       wielu buforów opisanych przez iov ("rozrzucone wejście").

       Funkcja writev() zapisuje co  najwyżej  iovcnt  bloków  opisanych  przez  iov  do  pliku  skojarzonego  z
       deskryptorem pliku fd ("zgromadzone wyjście").

       Wskaźnik iov prowadzi do struktury iovec zdefiniowanej w pliku <sys/uio.h> następująco:

           struct iovec {
               void  *iov_base;    /* Adres początkowy */
               size_t iov_len;     /* Liczba bajtów do przeniesienia */
           };

       Wywołanie systemowe readv() działa tak samo jak read(2), z tą różnicą że wypełnianych jest wiele buforów.

       Wywołanie  systemowe  writev()  działa  tak samo jak write(2), z tą różnicą że zapisywane dane pochodzą z
       wielu buforów.

       Bufory są przetwarzane w porządku, w  którym  zostały  wymienione  w  tablicy.  Oznacza  to,  że  readv()
       całkowicie  zapełni  iov[0]  zanim  przejdzie do iov[1] itd. (jeśli jest za mało danych, to nie wszystkie
       bufory w iov zostaną wypełnione). Podobnie writev zapisuje całkowicie zawartość iov[0],  zanim  przejdzie
       do iov[1], itd.

       Transfery  danych  przeprowadzane  przez readv() i writev() są atomowe: dane zapisywane przez writev() są
       zapisywane jako pojedynczy blok danych, niekolidujący z danymi zapisywanymi przez inne procesy (z  jednym
       wyjątkiem,  patrz  pipe(7)).  Analogicznie   readv() 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 open(2)).

   preadv() i pwritev()
       Wywołanie  systemowe  preadv()  łączy w sobie funkcjonalności dostarczane przez readv() i przez pread(2).
       Wykonuje to samo zadanie, co readv(), ale dodaje czwarty argument, offset, określający miejsce w pliku, w
       którym zostanie przeprowadzona operacja wejściowa.

       Wywołanie systemowe pwritev() łączy w sobie funkcjonalności dostarczane przez writev() i przez pwrite(2).
       Wykonuje to samo zadanie, co writev, ale dodaje czwarty argument, offset, 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 fd
       muszą pozwalać na swobodny dostęp (przeszukiwanie).

WARTOŚĆ ZWRACANA

       Gdy się powiodą, funkcje readv() i preadv() zwracają liczbę przeczytanych bajtów, a  funkcje  writev()  i
       pwritev()  zwracają  liczbę  bajtów  zapisanych.  W  przypadku  błędu zwracane jest -1 i odpowiednio jest
       ustawiana zmienna errno.

BŁĘDY

       Zwracane błędy są takie same, jak w przypadku funkcji read(2) i write(2). Ponadto  preadv()  i  pwritev()
       mogą także zwrócić błędy takie jak w przypadku lseek(2). Dodatkowo zdefiniowany jest następujący błąd:

       EINVAL Suma  wartości  iov_len  przekracza  rozmiar ssize_t albo liczba iovcnt wektorów jest mniejsza niż
              zero lub większa niż dopuszczalne maksimum.

WERSJE

       preadv() i pwritev() po raz pierwszy pojawiły się w Linuksie 2.6.30; wsparcie biblioteczne  tych  wywołań
       pojawiło się w glibc 2.10.

ZGODNE Z

       readv(), writev(): BSD 4.4 (wywołania te początkowo pojawiły się w BSD 4.2), POSIX.1-2001.

       preadv(), pwritev(): niestandardowe, ale obecne także w nowoczesnych systemach BSD.

UWAGI

   Różnice ABI biblioteki C/jądra
       Standard   POSIX.1-2001   dopuszcza,  aby  implementacja  wprowadziła  ograniczenia  na  liczbę  rekordów
       przekazywanych w parametrze iov. Limit ten jest określony jako wartość  IOV_MAX w <limits.h>, a w  czasie
       działania  programu  -   jako  wartość  zwracana przez wywołanie sysconf(_SC_IOV_MAX). Pod Linuksem limit
       określony przez te mechanizmy wynosi 1024, co  jest  prawdziwym  ograniczeniem  jądra  Linuksa.  Jednakże
       funkcje  glibc  wykonują  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   readv()  biblioteki  glibc
       przydziela  tymczasowy  bufor,  wystarczająco  duży, by pomieścić wszystkie elementy określone przez iov,
       przekazuje ten bufor wywołaniu systemowemu read(2), kopiuje dane z  bufora  tymczasowego  do  lokalizacji
       określonych przez iov, a następnie zwalnia pamięć bufora. Funkcja glibc dla writev() wykonuje analogiczne
       zadanie, używając bufora tymczasowego i wywołania funkcji write(2).

BŁĘDY

       Nie  jest  zalecane mieszanie wywołań funkcji operujących na deskryptorach plików, takich jak readv() czy
       writev(), z funkcjami biblioteki stdio; rezultaty takiego mieszania nie są określone i najprawdopodobniej
       nie będą zgodne z oczekiwaniami.

PRZYKŁAD

       Następujący przykładowy kod pokazuje użycie funkcji writev():

           char *str0 = "witaj ";
           char *str1 = "świecie\n";
           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);

ZOBACZ TAKŻE

       pread(2), read(2), write(2)

O STRONIE

       Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis  projektu,  informacje
       dotyczące   zgłaszania   błędów,   oraz   najnowszą   wersję   oryginału   można   znaleźć   pod  adresem
       http://www.kernel.org/doc/man-pages/.

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>.

       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ą  3.71 oryginału.

Linux                                              2014-08-19                                           READV(2)