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