Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       readv, writev, preadv, pwritev, preadv2, pwritev2 - czyta lub zapisuje dane do wielu buforów

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

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, opisanej w iovec(3type).

       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.
       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 sumę bitową (OR) z jednego lub więcej z następujących znaczników:

       RWF_DSYNC (od Linuksa 4.7)
              Udostępnia  ekwiwalent  znacznika  O_DSYNC  open(2),  tyle że do zapisu. Znacznik ten ma znaczenie
              jedynie dla pwritev2(), a jego efekty  stosują  się  tylko  w  zakresie  danych  zapisanych  przez
              wywołanie systemowe.

       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 ze znacznikiem O_DIRECT).

       RWF_SYNC (od Linuksa 4.7)
              Udostępnia ekwiwalent znacznika O_SYNC open(2), tyle że  do  zapisu.  Znacznik  ten  ma  znaczenie
              jedynie  dla  pwritev2(),  a  jego  efekty  stosują  się  tylko w zakresie danych zapisanych przez
              wywołanie systemowe.

       RWF_NOWAIT (od Linuksa 4.14)
              Nie oczekuje na dane, które nie są natychmiast dostępne. Jeśli poda się ten znacznik, to wywołanie
              systemowe  preadv2()  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 errno na  EAGAIN  (lecz
              zobacz USTERKI). Obecnie, znacznik ten ma znaczenie jedynie dla preadv2().

       RWF_APPEND (od Linuksa 4.16)
              Udostępnia  ekwiwalent  znacznika  O_APPEND  open(2), tyle że do zapisu. Znacznik ten ma znaczenie
              jedynie dla pwritev2(), a jego efekty  stosują  się  tylko  w  zakresie  danych  zapisanych  przez
              wywołanie  systemowe.  Argument offset nie wpływa na operację zapisu; dane są zawsze dopisywane do
              końca  pliku.  Jednakże,  jeśli  argument  offset  wynosi  -1,  bieżące  przesunięcie  pliku  jest
              uaktualniane.

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 ustawiane errno wskazując błąd.

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.

       EOPNOTSUPP
              Jako flags podano nieznaną flagę.

WERSJE

   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.

STANDARDY

       readv()
       writev()
              POSIX.1-2008.

       preadv()
       pwritev()
              BSD.

       preadv2()
       pwritev2()
              Linux.

HISTORIA

       readv()
       writev()
              POSIX.1-2001, 4.4BSD (pojawiło się pierwotnie w 4.2BSD).

       preadv(), pwritev(): Linux 2.6.30, glibc 2.10.

       preadv2(), pwritev2(): Linux 4.6, glibc 2.26.

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

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.

USTERKI

       Linux 5.9 i Linux 5.10 są obarczone błędem: preadv2() ze znacznikiem RWF_NOWAIT może zwrócić 0 nawet, gdy
       nie jest to koniec pliku.

PRZYKŁADY

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

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

ZOBACZ TAKŻE

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

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika są:  Robert  Luberda  <robert@debian.org>  i
       Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją.  Bliższe informacje o warunkach licencji można uzyskać
       zapoznając  się  z  GNU General Public License w wersji 3  lub  nowszej.   Nie   przyjmuje   się   ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy  w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej manpages-pl-
       list@lists.sourceforge.net.

Linux man-pages 6.8                              2 maja 2024 r.                                         readv(2)