Provided by: manpages-pl-dev_20060617-1_all bug

NAZWA

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

SKŁADNIA

       #include <sys/uio.h>

       ssize_t readv(int fd, const struct iovec *vector, int count);

       ssize_t writev(int fd, const struct iovec *vector, int count);

OPIS

       Funkcja  readv()  czyta  liczbę  count  bloków  z  pliku skojarzonego z
       desktyptorem pliku fd do wielu buforów opisanych przez wektor vector.

       Funkcja writev() zapisuje co  najwyżej  count  bloków  opisanych  przez
       wektor vector do pliku skojarzonego z deskryptorem pliku fd.

       Wskaźnik  vector  prowadzi  do  struktury  struct 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 */
         };

       Bufory są przetwarzane w kolejności, w jakiej zostały podane.

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

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

WARTOŚĆ ZWRACANA

       Gdy się powiodą, funkcja readv() zwraca liczbę przeczytanych bajtów,  a
       funkcja  writev()  zwraca  liczbę  bajtów zapisanych. W przypadku błędu
       zwracane jest -1 i odpowiednio jest ustawiona zmienna errno.

BŁĘDY

       Zwracane błędy są takie  same,  jak  w  przypadku  funkcji  read(2)   i
       write(2). Dodatkowo zdefiniowany jest następujący błąd:

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

ZGODNE Z

       4.4BSD  (funkcje readv() i writev()  początkowo pojawiły się w 4.2BSD),
       Unix98, POSIX 1003.1-2001. libc5 w Linuksie  używała  size_t  jako  typ
       parametru  count oraz int jako typ wartości zwracanej przez te funkcje.

UWAGI DOTYCZĄCE IMPLEMENTACJI POD LINUKSEM

       Standard SUSv3 dopuszcza, aby implementacja wprowadziła ograniczenia na
       liczbę  rekordów  przekazywanych  w  parametrze  vector. 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() bibloteki glibc przydziela  tymczasowy  bufor,
       wystarczająco  duży,  by  pomieścić  wszystkie elementy określone przez
       vector, przekazuje ten bufor wywołaniu systemowemu read(), kopiuje dane
       z  bufora  tymczasowego  do  lokalizacji  określonych  przez  vector, a
       następnie zwalnia pamięć bufora. Funkcja glibc  dla  writev()  wykonuje
       analogiczne  zadanie  używając  bufora tymczasowego i wywołania funkcji
       write().

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.

ZOBACZ TAKŻE

       read(2), write(2)

                                  2002-10-17                          READV(2)