NOM
write - Écrire dans un descripteur de fichier
SYNOPSIS
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
write() lit au maximum count octets dans la zone mémoire pointée par
buf, et les écrit dans le fichier référencé par le descripteur fd.
Le nombre d’octets écrits peut être inférieur à count par exemple si la
place disponible sur le périphérique est insuffisante, ou la limite de
ressource RLIMIT_FSIZE est atteinte (voir setrlimit(2)), ou l’appel est
interrompu par un gestionnaire de signal après avoir écrit moins de
count octets. (Voir aussi pipe(7).)
Pour un fichier sur lequel lseek(2) est possible (par exemple un
fichier ordinaire), l’écriture a lieu à la position courante dans le
fichier, et elle est déplacée du nombre d’octets effectivement écrits.
Si le fichier était ouvert avec O_APPEND, la position avant l’écriture
est à la fin du fichier. La modification de la position et l’écriture
sont effectuées de façon atomique.
POSIX réclame qu’une lecture avec read(2) effectuée après le retour
d’une écriture avec write(), renvoie les nouvelles données. Notez que
tous les systèmes de fichiers ne sont pas compatibles avec POSIX.
VALEUR RENVOYÉE
write() renvoie le nombre d’octets écrits (0 signifiant aucune
écriture), ou -1 s’il échoue, auquel cas errno contient le code
d’erreur.
Si count vaut 0 et si fd correspond à un fichier ordinaire, write()
peut renvoyer un code d’erreur si l’une des erreurs ci-dessous est
détectée. Si aucune erreur n’est détectée, 0 sera renvoyé sans autre
effet de bord. Si count est nul et fd est un fichier spécial, les
résultats sont indéfinis.
ERREURS
EAGAIN Le descripteur de fichier fd fait référence à un fichier autre
qu’une socket et a été marqué comme non bloquant (O_NONBLOCK),
et l’écriture devrait bloquer.
EAGAIN ou EWOULDBLOCK
Le descripteur de fichier fd fait référence à un fichier autre
qu’une socket et a été marqué comme non bloquant (O_NONBLOCK),
et l’écriture devrait bloquer. POSIX.1-2001 permet de renvoyer
l’une ou l’autre des erreurs dans ce cas et n’exige pas que ces
constantes aient la même valeur. Une application portable
devrait donc tester les deux possibilités.
EBADF fd n’est pas un descripteur de fichier valable, ou n’est pas
ouvert en écriture.
EFAULT buf pointe en dehors de l’espace d’adressage accessible.
EFBIG Tentative d’écrire un fichier dont la taille dépasse un maximum
dépendant de l’implémentation ou du processus, ou d’écrire à une
position qui dépasse le maximum autorisé.
EINTR L’appel système a été interrompu par un signal avant d’avoir pu
écrire quoi que ce soit ; voir signal(7).
EINVAL fd correspond à un objet sur lequel il est impossible d’écrire.
Ou bien le fichier a été ouvert avec l’attribut O_DIRECT, et
soit l’adresse de buf, soit la valeur de count, soit la position
actuelle dans le fichier ne sont pas alignées correctement.
EIO Une erreur d’entrée-sortie bas niveau s’est produite durant la
modification de l’inœud.
ENOSPC Le périphérique correspondant à fd n’a plus de place disponible.
EPIPE fd est connecté à un tube (pipe) ou une socket dont l’autre
extrémité est fermée. Quand ceci se produit, le processus
écrivain reçoit un signal SIGPIPE. (Ainsi la valeur de retour de
write n’est vue que si le programme intercepte, bloque ou ignore
ce signal.
D’autres erreurs peuvent se produire suivant le type d’objet associé à
fd.
CONFORMITÉ
SVr4, BSD 4.3, POSIX.1-2001.
Sous SVr4, un appel write() peut être interrompu, et renvoyer EINTR à
n’importe quel moment, pas seulement avant l’écriture des données.
NOTES
Une réussite de write() n’offre aucune garantie que les données se
trouvent sur le disque. En fait, sur certaines implémentations
erronées, elle ne garantit même pas que l’espace suffisant a été
réservé pour les données. La seule manière d’être sûr de la réussite
est d’invoquer fsync(2) après avoir écrit les données.
Si un write() est interrompu par un gestionnaire de signaux avant
d’avoir écrit quoi que ce soit, l’appel échoue avec EINTR ; s’il est
interrompu après avoir écrit au moins un octet, l’appel réussit et
renvoie le nombre d’octets écrits.
VOIR AUSSI
close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2),
read(2), select(2), writev(2), fwrite(3)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».