Linux

CentOS 5.3

readv(2)


READV

NOM

readv, writev − Lire ou écrire dans plusieurs tampons.

SYNOPSIS

#include <sys/uio.h>

int readv(int fd, const struct iovec * vecteur, int nb);

int writev(int fd, const struct iovec * vecteur, int nb);

DESCRIPTION

La fonction readv() lit nb blocs depuis le descripteur de fichier fd dans les multiples tampons décrits par le vecteur.

La fonction writev() écrit au plus nb blocs décrits par le vecteur dans le fichier associé au descripteur fd.

Le vecteur pointe sur une struct iovec définie dans <sys/uio.h> ainsi :

struct iovec {
    void *iov_base;   /* Adresse de début */
    size_t iov_len;   /* Nombre d’octets  */
};

Les tampons sont traités dans l’ordre indiqué.

La fonction readv() travaille comme read(2) sauf que plusieurs tampons sont remplis.

La fonction writev() travaille comme write(2) sauf que plusieurs tampons sont écrits.

VALEUR RENVOYÃE

S’ils réussissent readv() renvoie le nombre d’octets lus et writev() renvoie le nombre d’octets écrits. En cas d’échec −1 est renvoyé, et errno contient le code d’erreur.

ERREURS

Les erreurs indiquées pour read(2) et write(2) sont susceptibles de se produire. De plus, il peut survenir :

EINVAL

La somme des iov_len valeurs déborde du type ssize_t, ou le nombre nb de vecteur est nul ou supérieur à MAX_IOVEC.

CONFORMITÃ

BSD 4.4 (les fonctions readv() et writev() sont apparues dans BSD 4.2), POSIX.1-2001. La libc5 de Linux utilisait les types size_t pour le paramètre count et int en retour de ces fonctions.

NOTES LINUX

POSIX.1-2001 permet à une implémentation de placer une limite sur le nombre d’éléments qui peuvent être passés dans vector. Une implémentation peut annoncer cette limite en définissant IOV_MAX dans <limits.h> ou en cours d’exécution via la valeur de retour de sysconf(_SC_IOV_MAX). Sous linux, la limite annoncée par ces mécanismes est 1024, qui est la vraie limite du noyau. Toutefois, les fonctions enveloppes de la glibc effectuent un travail supplémentaire si elles détectent que l’appel système du noyau sous-jacent échoue parce que la limite a été dépassée. Dans le cas de readv(), la fonction enveloppe alloue un grand tampon temporaire pour tous les éléments spécifiés dans vector, passe ce tampon dans un appel à read(), copies les données du tampon aux endroits spécifiés par les champs iov_base des éléments de vector, puis libère le tampon. La fonction enveloppe de writev() effectue une tâche analogue en utilisant un tampon temporaire et un appel à write().

BOGUES

Il est déconseillé de mélanger les appels readv() ou writev() qui agissent sur les descripteurs avec les fonctions de la bibliothèque stdio ; les résultats sont indéfinis et probablement différents de ce que l’on attend.

VOIR AUSSI

read(2), write(2)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 14 octobre 1996 et révisée le 14 août 2006.

L’équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 readv ». N’hésitez pas à signaler à l’auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.


readv(2)