Man page - preadv(2)

Packages contains this manual

Available languages:

en fr it pl ja ru

Manual

read

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
preadv() et pwritev()
preadv2() et pwritev2()
VALEUR RENVOYÉE
ERREURS
VERSIONS
Différences entre bibliothÚque C et noyau
STANDARDS
HISTORIQUE
Différence historique entre la bibliothÚque C et le noyau
NOTES
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

readv, writev, preadv, pwritev, preadv2, pwritev2 - Lire ou écrire des données dans plusieurs tampons

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

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

ssize_t preadv2(int fd , const struct iovec * iov , int iovcnt ,
off_t
offset , int flags );
ssize_t pwritev2(int
fd , const struct iovec * iov , int iovcnt ,
off_t
offset , int flags );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

preadv (), pwritev () :
Depuis la glibc 2.19 :
_DEFAULT_SOURCE
glibc 2.19 et antérieures :
_BSD_SOURCE

DESCRIPTION

L’appel systĂšme readv () lit iovcnt tampons depuis le fichier associĂ© au descripteur de fichier fd dans les tampons dĂ©crits par iov (« scatter input »).

L’appel systĂšme writev () Ă©crit au plus iovcnt tampons de donnĂ©es dĂ©crits par iov dans le fichier associĂ© au descripteur fd (« gather output »).

Le pointeur iov pointe vers un tableau de structures iovec , définies dans iovec (3type)

L’appel systùme readv () travaille comme read (2) sauf que plusieurs tampons sont remplis.

L’appel systĂšme writev () travaille comme write (2) sauf que plusieurs tampons sont Ă©crits.

Les tampons sont considĂ©rĂ©s dans l’ordre du tableau. Cela signifie que readv () remplit iov [0] complĂštement avant d’en arriver Ă  iov [1], et ainsi de suite (s’il n’y a pas assez de donnĂ©es, tous les tampons pointĂ©s par iov ne seront pas forcĂ©ment remplis). De mĂȘme, writev () Ă©crit tout le contenu de iov [0] avant de considĂ©rer iov [1] et ainsi de suite.

Les transferts de donnĂ©es effectuĂ©s par readv () et writev () sont atomiques : les donnĂ©es Ă©crites par writev () sont Ă©crites d’un seul bloc qui n’est pas interrompu par des Ă©critures venant d’autres processus ; de façon similaire, readv () a la garantie de lire un bloc contigu de donnĂ©es depuis le fichier, quelles que soient les opĂ©rations de lecture effectuĂ©es par d’autres threads ou processus qui ont des descripteurs de fichier correspondant Ă  la mĂȘme description de fichier ouvert (consultez open (2)).

preadv() et pwritev()

L’appel systĂšme preadv () combine les fonctionnalitĂ©s de readv () et pread (2). Il effectue la mĂȘme tĂąche que readv (), mais ajoute un quatriĂšme paramĂštre, offset , qui indique la position dans le fichier Ă  partir de laquelle l’opĂ©ration d’entrĂ©e doit ĂȘtre effectuĂ©e.

L’appel systĂšme pwritev () combine les fonctionnalitĂ©s de writev () et pwrite (2). Il effectue la mĂȘme tĂąche que writev (), mais ajoute un quatriĂšme paramĂštre, offset , qui indique la position dans le fichier Ă  partir de laquelle l’opĂ©ration de sortie doit ĂȘtre effectuĂ©e.

La position dans le fichier n’est pas modifiĂ©e par ces appels systĂšme. Le fichier dĂ©crit par fd doit permettre le positionnement.

preadv2() et pwritev2()

Ces appels systĂšme sont identiques aux appels preadv () et pwritev () mais ils ajoutent un cinquiĂšme paramĂštre ( flags ) qui change le comportement sur la base de chaque appel.

Contrairement Ă  preadv () et pwritev (), si le paramĂštre offset est -1 , la tĂȘte de lecture du fichier actuel est utilisĂ©e et mise Ă  jour.

L’argument flags est un opĂ©rateur OU binaire contenant zĂ©ro ou plusieurs des attributs suivants :
RWF_DSYNC
(depuis Linux 4.7)

Fournir un Ă©quivalent par Ă©criture Ă  l’attribut O_DSYNC d’ open (2). Cet attribut n’a de sens que pour pwritev2 () et son effet ne vaut que pour la plage de donnĂ©es Ă©crite par l’appel systĂšme.

RWF_HIPRI (depuis Linux 4.6)

Lecture/Ă©criture haute prioritĂ©. Cela permet Ă  des systĂšmes de fichiers fondĂ©s sur les blocs d’utiliser la scrutation du pĂ©riphĂ©rique, ce qui donne moins de latence mais peut coĂ»ter plus de ressources (actuellement, cette fonctionnalitĂ© n’est utilisable que sur un descripteur de fichier ouvert avec l’attribut O_DIRECT ).

RWF_SYNC (depuis Linux 4.7)

Fournir un Ă©quivalent par Ă©criture de l’attribut O_SYNC d’ open (2). Cet attribut n’a de sens que pour pwritev2 () et son effet ne vaut que pour la plage de donnĂ©es Ă©crites avec cet appel systĂšme.

RWF_NOWAIT (depuis Linux 4.14)

Ne pas attendre les donnĂ©es qui ne sont pas immĂ©diatement disponibles. Si cet attribut est indiquĂ©, l’appel systĂšme preadv2 () renverra quelque chose instantanĂ©ment s’il doit lire des donnĂ©es provenant d’un stockage de cache ou attendre un verrou. Si des donnĂ©es ont Ă©tĂ© lues avec succĂšs, il renverra le nombre d’octets lus. Si aucun octet n’est lu, il renverra -1 et positionnera errno sur EAGAIN (mais consultez BOGUES ). Actuellement, cet attribut n’a de sens que pour preadv2 ().

RWF_APPEND (depuis Linux 4.16)

Fournir un Ă©quivalent par Ă©criture de l’attribut O_APPEND d’ open (2). Cet attribut n’a de sens que pour pwritev2 et son effet ne vaut que pour la plage de donnĂ©es Ă©crite par cet appel systĂšme. Le paramĂštre offset n’affecte pas l’opĂ©ration d’écriture ; les donnĂ©es vont toujours Ă  la fin du fichier. Cependant, si le paramĂštre offset est -1 , la tĂȘte de lecture du fichier actuel est mise Ă  jour.

VALEUR RENVOYÉE

S’ils rĂ©ussissent, readv (), preadv () et preadv2 () renvoient le nombre d’octets lus ; writev , pwritev () et pwritev2 () renvoient le nombre d’octets Ă©crits.

Remarquez que le fait de transfĂ©rer moins d’octets que ceux demandĂ©s (voir read (2) et write (2)) ne constitue pas une erreur empĂȘchant le succĂšs de l’appel.

En cas d’erreur, la valeur de retour est -1 et errno est dĂ©finie pour prĂ©ciser l’erreur.

ERREURS

Les erreurs sont comme celles indiquĂ©es pour read (2) et write (2). En outre, preadv (), preadv2 () et pwritev () peuvent aussi Ă©chouer pour les mĂȘmes raisons que lseek (2). De plus, les erreurs suivantes peuvent survenir :

EINVAL

La somme des valeurs iov_len dépasse une valeur ssize_t .

EINVAL

Le nombre de vecteurs iovcnt est inférieur à zéro ou supérieur au maximum autorisé.

EOPNOTSUPP

Un drapeau inconnu est indiqué dans flags .

VERSIONS

Différences entre bibliothÚque C et noyau

Les appels systĂšme preadv () et pwritev () bruts ont une signature d’appel diffĂ©rant lĂ©gĂšrement de celle des fonctions d’enveloppe de la bibliothĂšque C prĂ©sentĂ©es dans le SYNOPSIS. Le paramĂštre offset final est dĂ©paquetĂ© par les fonctions d’enveloppe sous la forme de deux paramĂštres des appels systĂšme :

unsigned long pos_l , unsigned long pos

Ces paramùtres contiennent respectivement les 32 bits d’ordre bas et haut de l’ offset .

STANDARDS

readv ()
writev
()

POSIX.1-2008.

preadv ()
pwritev
()

BSD.

preadv2 ()
pwritev2
()

Linux.

HISTORIQUE

readv ()
writev
()

POSIX.1-2001, 4.4BSD (apparu dans 4.2BSD).

preadv (), pwritev () : Linux 2.6.30, glibc 2.10.

preadv2 (), pwritev2 () : Linux 4.6, glibc 2.26.

Différence historique entre la bibliothÚque C et le noyau

Pour gĂ©rer le fait que IOV_MAX Ă©tait trop bas sur les premiĂšres versions de Linux, les fonctions d’enveloppe de la glibc pour readv () et writev () effectuaient un travail supplĂ©mentaire si elles dĂ©tectaient que les appels systĂšme du noyau sous-jacents Ă©chouaient Ă  cause d’un dĂ©passement de la limite. Pour readv (), la fonction d’enveloppe allouait un tampon temporaire assez grand pour tous les Ă©lĂ©ments de iov , passait ce tampon dans un appel read (2), copiait les donnĂ©es du tampon vers les emplacements indiquĂ©s par le champ iov_base des Ă©lĂ©ments de iov , puis libĂ©rait le tampon. La fonction d’enveloppe de writev () faisait la mĂȘme chose avec un tampon temporaire et un appel Ă  write (2).

La nĂ©cessitĂ© d’un tel effort supplĂ©mentaire pour les fonctions d’enveloppe de la glibc a disparu avec Linux 2.2 et ultĂ©rieurs. Cependant la glibc a continuĂ© Ă  fournir ce comportement jusqu’à la glibs 2.10. À partir de la version 2.9 de la glibc, les fonctions d’enveloppe ne fournissent ce comportement que si la bibliothĂšque dĂ©tecte que le systĂšme a un noyau Linux plus ancien que Linux 2.6.18 (une version du noyau sĂ©lectionnĂ©e de façon arbitraire). Depuis la glibc 2.20 (qui nĂ©cessite au minimum Linux 2.6.32), les fonctions d’enveloppe de la glibc appellent simplement les appels systĂšme dans tous les cas.

NOTES

POSIX.1 autorise une implĂ©mentation Ă  poser une limite au nombre d’élĂ©ments qui peuvent ĂȘtre placĂ©s dans iov . Une implĂ©mentation peut indiquer cette limite en dĂ©finissant IOV_MAX dans <limits.h> ou pendant l’exĂ©cution Ă  l’aide d’un code de retour issu de sysconf(_SC_IOV_MAX) . Sur les systĂšmes Linux modernes, la limite est de 1024. À l’époque de Linux 2.0, la limite Ă©tait de 16.

BOGUES

Linux 5.9 et Linux 5.10 contiennent un bogue dans lequel preadv2 () avec l’attribut RWF_NOWAIT peut renvoyer 0 mĂȘme quand la fin du fichier n’est pas atteinte.

EXEMPLES

Le segment de code suivant donne un exemple d’utilisation de writev () :

char *str0 = "hello ";
char *str1 = "world\n";
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);

VOIR AUSSI

pread (2), read (2), write (2)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com>, Jean-Philippe MENGUAL <jpmengual@debian.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .