bionic (2) writev.2.gz

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