Provided by: manpages-it_3.73-2_all bug

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.

       preadv(), pwritev(): non standard, però presente anche nei sistemi BSD moderni.

NOTE

   Differenze tra le ABI della libreria C e del kernel
       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(2),  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(2).

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.73 del progetto Linux man-pages. Una descrizione del progetto, le
       istruzioni per la  segnalazione  degli  errori,  e  l'ultima  versione  di  questa  pagina  si  trova  su
       http://www.kernel.org/doc/man-pages/.

       La  versione  italiana  fa  parte  del  pacchetto  man-pages-it  v.  3.73, 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

Linux                                              2014-08-19                                           READV(2)