Provided by: manpages-pl-dev_0.7-1_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);

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

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

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

       preadv(), pwritev():
           Od glibc 2.19:
               _DEFAULT_SOURCE
           Glibc 2.19 i wcześniejsze:
               _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).

   preadv2() i pwritev2()
       Te wywołania systemowe są podobne do wywołań preadv() i  pwritev(),  lecz  dodają piąty  argument  flags,
       modyfikujący zachowanie w zależności od wywołania.

       W  przeciwieństwie  do  preadv() i pwritev(), jeśli argument offset wynosi -1, to używane i aktualizowane
       jest przesunięcie bieżącego pliku.

       Argument flags zawiera bitowe LUB z jednej lub więcej z następujących flag:

       RWF_HIPRI (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ą O_DIRECT).

WARTOŚĆ ZWRACANA

       Gdy się powiodą, funkcje readv(), preadv() i preadv2() zwracają liczbę przeczytanych  bajtów,  a  funkcje
       writev(), pwritev() i pwritev2() 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. read(2) i write(2)).

       W razie wystąpienia błędu zwracane jest -1 i ustawiana jest odpowiednia wartość zmiennej errno.

BŁĘDY

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

       EINVAL Suma wartości iov_len przekracza rozmiar ssize_t.

       EINVAL Liczba iovcnt wektorów jest mniejsza niż zero lub większa niż dopuszczalne maksimum.

       EINVAL Jako flags podano nieznaną flagę.

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.

       preadv2() i pwritev2() po raz pierwszy pojawiły się w Linuksie 4.6.

ZGODNE Z

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

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

       preadv2(), pwritev2(): niestandardowe rozszerzenie systemu Linux.

UWAGI

       POSIX.1 pozwala w implementacji umieścić ograniczenie liczby argumentów, które mogą być przekazane w iov.
       Implementacja może rozgłosić ten limit  definiując  IOV_MAX  w  <limits.h>  lub  w  czasie  uruchomienia,
       zwracaną  wartością  z  sysconf(_SC_IOV_MAX).  Na  współczesnych systemach Linux limit ten wynosi 1024. W
       czasach Linuksa 2.0 wynosił 16.

   Różnice biblioteki C/jądra
       Surowe wywołania systemowe  preadv()  i  pwritev()  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 offset,
       jest rozpakowany przez funkcję opakowującą na dwa argumenty wywołania systemowego:

        unsigned long pos_l, unsigned long pos

       Argumenty te zawierają 32 bitowy offset w kolejności odpowiednio, od najmniej i od najbardziej znaczącego
       bitu.

   Historyczne różnice biblioteki C/jądra
       Aby  rozwiązać  sytuację,  gdy IOV_MAX było tak niskie we wczesnych wersjach Linuksa, funkcje opakowujące
       readv() i writev() 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 readv() biblioteki glibc
       przydzielała tymczasowy bufor, wystarczająco duży, by pomieścić wszystkie elementy określone  przez  iov,
       przekazywała ten bufor wywołaniu systemowemu read(2), kopiowała dane z bufora tymczasowego do lokalizacji
       określonych przez iov, a następnie  zwalniała  pamięć  bufora.  Funkcja  glibc  dla  writev()  wykonywała
       analogiczne zadanie, używając bufora tymczasowego i wywołania funkcji write(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 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 4.07 projektu Linux man-pages. 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/.

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