READV(2)

NOME
readv, writev, preadv, pwritev - leggono o scrivono dati in buffer multipli

SINTASSI
#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);

Macro per test di funzionalità richieste per glibc (si veda feature_test_macros(7)):

preadv(), pwritev(): _BSD_SOURCE

DESCRIZIONE
La chiamata di sistema readv() legge i buffer iovcnt dal file associato al descrittore di file fd nei buffer descritti da iov ("scatter input").

La chiamata di sistema writev() scrive i buffer di dati iovcnt descritti da iov nel file associato al descrittore di file fd ("gather output").

Il puntatore iov punta a un array di strutture iovec , definite in <sys/uio.h> come:

struct iovec {
    void  *iov_base;    /* Starting address */
    size_t iov_len;     /* Number of bytes to transfer */
};

La chiamata di sistema readv() funzione esattamente come read(2) tranne per il fatto che i buffer multipli sono riempiti.

La chiamata di sistema writev() funzione esattamente come write(2) tranne per il fatto che i buffer multipli sono svuotati.

I buffer sono elaborati in ordine di array Ciò significa che readv() riempie completamente iov[0] prima di procedere a iov[1], e così via. (Se ci sono dati insufficienti allora non tutti i buffer puntati da iov possono essere riempiti) Similarmente, writev() estrae l'intero contenuto di iov[0] prima di procedere a iov[1], e così via.

I trasferimenti di dati eseguiti da readv() e writev() sono atomici: il dato scritto da writev() è scritto come un blocco singolo che non è mescolato con output provenienti da scritture in altri processi (tuttavia si veda pipe(7) per un'eccezione); analogamente, readv() è garantito che legga un blocco contiguo di dati dal file, indipendentemente dalle operazioni di lettura eseguite in altri thread o processi che hanno descrittori di file che fanno riferimento alla stessa descrizione di file aperto (si veda open(2)).

  preadv() e pwritev()
La chiamata di sistema preadv() combina le funzionalità di readv() e di pread(2). Realizza lo stesso compito di readv(), ma aggiunge un quarto argomento, offset, che specifica la posizione nel file (offset) alla quale dev'essere effettuata l'operazione di input. La chiamata d sistema pwritev() combina le funzionalità di writev() e di pwrite(2). Realizza lo stesso compito di writev(), ma aggiunge un quarto argomento, offset, che specifica la posizione nel file (offset) alla quale dev'essere effettuata l'operazione di input. L'offset nel file non viene modificato da queste chiamate di sistema. Il file al quale fa riferimento fd deve deve poter permettere il posizionamento a un offset.

VALORE RESTITUITO
In caso di successo, readv() e preadv() restituiscono il numero di byte letti; writev() e pwritev() restituiscono il numero di byte scritti. In caso di errore viene restituito -1 , e errno è impostato appropriatamente.

ERRORI
Gli errori sono gli stessi di read(2) e write(2). Per di più, preadv() e pwritev() possono anche non andare a buon fine per le stesse ragioni di lseek(2). Inoltre è definito il seguente errore:

EINVAL
    La somma dei valori iov_len supera un valore ssize_t . Oppure, il vettore conteggio iovcnt è minore di zero o maggiore del massimo permesso.

VERSIONI
preadv() e pwritev() sono apparse per la prima volta in Linux 2.6.30; il supporto alla libreria è stato aggiunto in glibc 2.10.

CONFORME A
readv(), writev(): 4.4BSD (queste chiamate di sistema sono apparse per la prima volta in 4.2BSD), POSIX.1-2001. Linux libc5 usava size_t come tipo per l'argomento iovcnt , e int come tipo restituito. preadv(), pwritev(): non standard, però presente anche nei sistemi BSD moderni.

NOTE
POSIX.1-2001 permette un'implementazione per porre un limite al numero di elementi che possono essere passati in iov. Un'implementazione può pubblicizzare i suoi limiti definendo IOV_MAX in <limits.h> o in run time attraverso il valore restituito da sysconf(_SC_IOV_MAX). Su Linux, il limite pubblicizzato per questo meccanismo è 1024, che è il limite reale del kernel. Tuttavia, le funzioni wrapper glibc fanno del lavoro extra se rilevano che la chiamata di sistema del kernel sottostante ha fallito perché i suoi limiti sono stati superati. Nel caso di readv() la funzione wrapper alloca un buffer temporaneo abbastanza grande per tutti gli elementi specificati da iov, passa questo buffer in una chiamata a read(), copia i dati dal buffer alle posizioni specificate dai campi iov_base degli elementi di iov, e infine libera il buffer. La funzione wrapper per writev() esegue l'attività analoga usando un buffer temporaneo e una chiamata a write().

BUG
Non è consigliabile mischiare chiamate a readv() o writev(), che operano sui descrittori dei file, con le funzioni della libreria stdio; i risultati sarebbero indefiniti e probabilmente non ciò che si vuole.

ESEMPIO
Il seguente codice di esempio mostra l'uso di writev():
char *str0 = "hello ";
char *str1 = "world\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);

VEDERE ANCHE
pread(2), read(2), write(2)

COLOPHON
Questa pagina fa parte del rilascio 3.64 del progetto Linux man-pages. Una descrizione del progetto, e le istruzioni per la segnalazione degli errori, si trova su http://www.kernel.org/doc/man-pages/. La versione italiana fa parte del pacchetto man-pages-it v. 3.64, a cura di: ILDP "Italian Linux Documentation Project" http://www.pluto.it/ildp
Per la traduzione in italiano si può fare riferimento a http://www.pluto.it/ildp/collaborare/
Segnalare eventuali errori di traduzione a ildp@pluto.it