READV(2)

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)