.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2007, 2010 Michael Kerrisk .\" and Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified Sat Jul 24 18:34:44 1993 by Rik Faith (faith@cs.unc.edu) .\" Merged readv.[23], 2002-10-17, aeb .\" 2007-04-30 mtk, A fairly major rewrite to fix errors and .\" add more details. .\" 2010-11-16, mtk, Added documentation of preadv() and pwritev() .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH readv 2 "3 maggio 2023" "Linux man\-pages 6.05.01" .SH NOME readv, writev, preadv, pwritev, preadv2, pwritev2 \- leggono o scrivono dati in buffer multipli .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH SINTASSI .nf \fB#include \fP .PP \fBssize_t readv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP \fBssize_t writev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP .PP \fBssize_t preadv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB);\fP \fBssize_t pwritev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB);\fP .PP \fBssize_t preadv2(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB, int \fP\fIflags\fP\fB);\fP \fBssize_t pwritev2(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .PP .RS -4 Macro per test di funzionalità per glibc (vedere \fBfeature_test_macros\fP(7)): .RE .PP \fBpreadv\fP(), \fBpwritev\fP(): .nf A partire da glibc 2.19: _DEFAULT_SOURCE glibc 2.19 e precedenti: _BSD_SOURCE .fi .SH DESCRIZIONE La chiamata di sistema \fBreadv\fP() legge i buffer \fIiovcnt\fP dal file associato al descrittore di file \fIfd\fP nei buffer descritti da \fIiov\fP ("scatter input"). .PP La chiamata di sistema \fBwritev\fP() scrive i buffer di dati \fIiovcnt\fP descritti da \fIiov\fP nel file associato al descrittore di file \fIfd\fP ("gather output"). .PP The pointer \fIiov\fP points to an array of \fIiovec\fP structures, described in \fBiovec\fP(3type). .PP La chiamata di sistema \fBreadv\fP() funziona esattamente come \fBread\fP(2) tranne per il fatto che i buffer multipli sono riempiti. .PP La chiamata di sistema \fBwritev\fP() funziona esattamente come \fBwrite\fP(2) tranne per il fatto che i buffer multipli sono svuotati. .PP I buffer sono elaborati in ordine di array. Ciò significa che \fBreadv\fP() riempie completamente \fIiov[0]\fP prima di procedere a \fIiov[1]\fP, e così via. (Se ci sono dati insufficienti allora non tutti i buffer puntati da \fIiov\fP possono essere riempiti) Similarmente, \fBwritev\fP() estrae l'intero contenuto di \fIiov[0]\fP prima di procedere a \fIiov[1]\fP, e così via. .PP .\" Regarding atomicity, see https://bugzilla.kernel.org/show_bug.cgi?id=10596 I trasferimenti di dati eseguiti da \fBreadv\fP() e \fBwritev\fP() sono atomici: il dato scritto da \fBwritev\fP() è scritto come un blocco singolo che non è mescolato con output provenienti da scritture in altri processi ; analogamente, \fBreadv\fP() è 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 \fBopen\fP(2)). .SS "preadv() e pwritev()" La chiamata di sistema \fBpreadv\fP() combina le funzionalità di \fBreadv\fP() e di \fBpread\fP(2). Realizza lo stesso compito di \fBreadv\fP(), ma aggiunge un quarto argomento, \fIoffset\fP, che specifica la posizione nel file (offset) alla quale dev'essere effettuata l'operazione di input. .PP La chiamata di sistema \fBpwritev\fP() combina le funzionalità di \fBwritev\fP() e di \fBpwrite\fP(2). Realizza lo stesso compito di \fBwritev\fP(), ma aggiunge un quarto argomento, \fIoffset\fP, che specifica la posizione nel file (offset) alla quale dev'essere effettuata l'operazione di input. .PP L'offset nel file non viene modificato da queste chiamate di sistema. Il file al quale fa riferimento \fIfd\fP deve poter permettere il posizionamento a un offset. .SS "preadv2() e pwritev2()" Queste chiamate di sistema sono simili alle chiamate \fBpreadv\fP() e \fBpwritev\fP(), ma aggiungono un quinto argomento, \fIflags\fP, che modifica il comportamento a seconda del tipo di chiamata. .PP A differenza di \fBpreadv\fP() e \fBpwritev\fP(), se l'argomento \fIoffset\fP è \-1, viene usato e aggiornato l'offset del file corrente. .PP L'argomento \fIflags\fP contiene un OR binario di zero o più dei seguenti flag: .TP \fBRWF_DSYNC\fP (da Linux 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 Equivale a richiedere a livello di una singola scrittura la funzione richiesta dal flag \fBO_DSYNC\fP di \fBopen\fP(2). Questo flag è significativo solo per \fBpwritev2\fP(), e il suo risultato si applica solo all'intervallo di dati scritto dalla chiamata di sistema. .TP \fBRWF_HIPRI\fP (da Linux 4.6) Lettura/scrittura ad alta priorità. Permette ai filesystem basati su blocchi di usare la funzione di polling (interrogazione periodica) del dispositivo, il che permette di abbreviare il periodo di latenza, ma può implicare il consumo di ulteriori risorse. (Attualmente, questa funzionalità è usabile solo su un descrittore di fileaperto usando il flag \fBO_DIRECT\fP.) .TP \fBRWF_SYNC\fP (da Linux 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 Costituisce un equivalente per ogni singola scrittura (per\-write) del flag \fBO_SYNC\fP di \fBopen\fP(2). Questo flag è significativo solo per \fBpwritev2\fP(), e il suo risultato si applica solo all'intervallo di dati scritto dalla chiamata di sistema. .TP \fBRWF_NOWAIT\fP (da Linux 4.14) .\" commit 3239d834847627b6634a4139cf1dc58f6f137a46 .\" commit 91f9943e1c7b6638f27312d03fe71fcc67b23571 Non attende i dati che non sono immediatamente disponibili. Se è stato specificato questo flag, la chiamata di sistema \fBpreadv2\fP() torna al chiamante senza fare nulla se i dati da leggere devono essere rintracciati da disco o se occorre attendere per un lock Se qualche dato è stato letto con successo, restituisce il numero di byte letti. Se non è stato letto nessun byte, restituisce \-1 e imposta \fIerrno\fP a \fBEAGAIN\fP (però si veda \fBBUGS\fP). Attualmente, questo flag è significativo solo per \fBpreadv2\fP(). .TP \fBRWF_APPEND\fP (da Linux 4.16) .\" commit e1fc742e14e01d84d9693c4aca4ab23da65811fb Costituisce un equivalente per ogni singola scrittura (per\-write) del flag \fBO_APPEND\fP \fBopen\fP(2) flag. Questo flag è significativo solo per \fBpwritev2\fP(), e il suo risultato si applica solo all'intervallo di dati scritto dalla chiamata di sistema. L'argomento \fIoffset\fP non influisce sull'operazione di scrittura; i dati sono sempre accodati alla fine del file. Comunque, se l'argomento \fIoffset\fP è \-1, si usa e si aggiorna il file all'offset corrente. .SH "VALORE RESTITUITO" In caso di successo, \fBreadv\fP(), \fBpreadv\fP() e \fBpreadv2\fP() restituiscono il numero di byte letti; \fBwritev\fP(), \fBpwritev\fP() e \fBpwritev2\fP() restituiscono il numero di byte scritti. .PP Si noti che non è un errore per una chiamata andata a buon fine trasferire meno byte di quelli richiesti (si veda \fBread\fP(2) e \fBwrite\fP(2)). .PP In caso di errore viene restituito \-1 , e \fIerrno\fP è impostato per indicare l'errore. .SH ERRORI Gli errori sono gli stessi di \fBread\fP(2) e \fBwrite\fP(2). Per di più, \fBpreadv\fP(), \fBpreadv2\fP(), \fBpwritev\fP(), e \fBpwritev2\fP() possono anche non andare a buon fine per le stesse ragioni di \fBlseek\fP(2). Inoltre sono definiti i seguenti errori: .TP \fBEINVAL\fP La somma dei valori \fIiov_len\fP supera un valore \fIssize_t\fP. .TP \fBEINVAL\fP Il vettore conteggio, \fIiovcnt\fP, è minore di zero o maggiore del massimo permesso. .TP \fBEOPNOTSUPP\fP Un flag sconosciuto è specificato in \fIflags\fP. .SH VERSIONI .SS "Differenze tra la libreria C e il kernel" Le chiamate di sistema dirette \fBpreadv\fP() e \fBpwritev\fP() hanno firme che differiscono leggermente da quelle delle corrispondenti funzioni wrapper della libreria GNU C viste nella SINTASSI. L'argomento finale, \fIoffset\fP, è spacchettato dalle funzioni wrapper in due argomenti nelle chiamate di sistema: .PP \fB unsigned long \fP\fIpos_l\fP\fB, unsigned long \fP\fIpos\fP .PP Questi argomenti contengono, rispettivamente, i 32 bit meno significativi e i 32 bit più significativi di \fIoffset\fP. .SH STANDARDS .TP \fBreadv\fP() .TQ \fBwritev\fP() POSIX.1\-2008. .TP \fBpreadv\fP() .TQ \fBpwritev\fP() BSD. .TP \fBpreadv2\fP() .TQ \fBpwritev2\fP() Linux. .SH STORIA .TP \fBreadv\fP() .TQ \fBwritev\fP() .\" Linux libc5 used \fIsize_t\fP as the type of the \fIiovcnt\fP argument, .\" and \fIint\fP as the return type. .\" The readv/writev system calls were buggy before Linux 1.3.40. .\" (Says release.libc.) POSIX.1\-2001, 4.4BSD (first appeared in 4.2BSD). .PP \fBpreadv\fP(), \fBpwritev\fP(): Linux 2.6.30, glibc 2.10. .PP \fBpreadv2\fP(), \fBpwritev2\fP(): Linux 4.6, glibc 2.26. .SS "Precedenti differenze tra la libreria C e il kernel" Per affrontare il fatto che \fBIOV_MAX\fP era così basso nelle prime versioni di Linux, le funzioni wrapper di glibc per \fBreadv\fP() e \fBwritev\fP() facevano un lavoro aggiuntivo se rilevavano che la sottostante chiamata di sistema al kernel falliva perché era stato superato questo limite. Nel caso di \fBreadv\fP() la funzione wrapper allocava un buffer temporaneo abbastanza grande per tutti gli elementi specificati da \fIiov\fP, passava questo buffer in una chiamata a \fBread\fP(2), copiava i dati dal buffer alle posizioni specificate dai campi \fIiov_base\fP degli elementi di \fIiov\fP, e infine liberava il buffer. La funzione wrapper per \fBwritev\fP() eseguiva l'attività analoga usando un buffer temporaneo e una chiamata a \fBwrite\fP(2). .PP The need for this extra effort in the glibc wrapper functions went away with Linux 2.2 and later. However, glibc continued to provide this behavior until glibc 2.10. Starting with glibc 2.9, the wrapper functions provide this behavior only if the library detects that the system is running a Linux kernel older than Linux 2.6.18 (an arbitrarily selected kernel version). And since glibc 2.20 (which requires a minimum of Linux 2.6.32), the glibc wrapper functions always just directly invoke the system calls. .SH NOTE .\" .\" POSIX.1 permette un'implementazione per porre un limite al numero di elementi che possono essere passati in \fIiov\fP. Un'implementazione può pubblicizzare i suoi limiti definendo \fBIOV_MAX\fP in \fI\fP o in run time attraverso il valore restituito da \fIsysconf(_SC_IOV_MAX)\fP. Sui sistemi Linux moderni, il limite è 1024, prima di Linux 2.0 questo limite era 16. .SH BUG .\" See .\" .\" The bug was introduced in .\" efa8480a831 fs: RWF_NOWAIT should imply IOCB_NOIO .\"and fixed in .\" 06c0444290 mm/filemap.c: generic_file_buffered_read() now uses find_get_pages_contig Linux 5.9 and Linux 5.10 have a bug where \fBpreadv2\fP() with the \fBRWF_NOWAIT\fP flag may return 0 even when not at end of file. .SH ESEMPI Il seguente codice di esempio mostra l'uso di \fBwritev\fP(): .PP .in +4n .EX char *str0 = "hello "; char *str1 = "world\en"; ssize_t nwritten; struct iovec iov[2]; \& 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); .EE .in .SH "VEDERE ANCHE" \fBpread\fP(2), \fBread\fP(2), \fBwrite\fP(2) .PP .SH TRADUZIONE La traduzione italiana di questa pagina di manuale è stata creata da Giulio Daprelà e Marco Curreli . .PP Questa traduzione è documentazione libera; leggere la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Versione 3 .UE o successiva per le condizioni di copyright. Non ci assumiamo alcuna responsabilità. .PP Per segnalare errori nella traduzione di questa pagina di manuale inviare un messaggio a .MT pluto-ildp@lists.pluto.it .ME .