Man page - write(2)

Packages contains this manual

Available languages:

en fr it pl nl ja ru ro zh_TW zh_CN de

Manual

write

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
BOGUES
VOIR AUSSI
TRADUCTION

NOM

write - Écrire dans un descripteur de fichier

BIBLIOTHÈQUE

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

SYNOPSIS

#include <unistd.h>

ssize_t write(int fd , const void buf [. count ], size_t count );

DESCRIPTION

write () écrit au maximum count octets dans le tampon démarrant à buf dans le fichier référencé par le descripteur de fichier fd .

Le nombre d’octets Ă©crits peut ĂȘtre infĂ©rieur Ă  count par exemple si la place disponible sur le mĂ©dia physique est insuffisante, ou si la limite de ressource RLIMIT_FSIZE est atteinte (consultez setrlimit (2)), ou l’appel est interrompu par un gestionnaire de signal aprĂšs avoir Ă©crit moins de count octets. (Consultez aussi pipe (7).)

Pour un fichier sur lequel lseek (2) est possible (par exemple un fichier ordinaire), l’écriture a lieu Ă  la position pointĂ©e dans le fichier, et elle est dĂ©placĂ©e du nombre d’octets effectivement Ă©crits. Si le fichier Ă©tait ouvert par open (2) avec O_APPEND , la position pointĂ©e est fixĂ©e d’abord Ă  la fin du fichier avant l’écriture. 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 de façon avĂ©rĂ©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.

Selon POSIX.1, si count est supĂ©rieur Ă  SSIZE_MAX , le rĂ©sultat est dĂ©fini par l’implĂ©mentation ; consultez NOTES pour la limite supĂ©rieure dans Linux.

VALEUR RENVOYÉE

En cas de succĂšs, le nombre d’octets Ă©crits est renvoyĂ©. Si cet appel systĂšme Ă©choue, il renvoie -1 et errno est dĂ©fini pour indiquer l’erreur.

Il faut remarquer qu’un appel write () rĂ©ussi peut transfĂ©rer moins que count octets. Ces Ă©critures partielles peuvent se produire pour diverses raisons, par exemple, Ă  cause d’un espace insuffisant dans le pĂ©riphĂ©rique disque pour Ă©crire tous les octets demandĂ©s, ou Ă  cause d’un write () bloquĂ© pour un socket, un tube ou similaire, Ă©tait interrompu par un gestionnaire de signal aprĂšs un transfert partiel, mais avant le transfert de tout les octets demandĂ©s. Dans l’éventualitĂ© d’une Ă©criture partielle, l’appelant peut faire un autre appel write () pour transfĂ©rer les octets restants. Cet appel consĂ©cutif transfĂšre les octets supplĂ©mentaires ou peut aboutir Ă  une erreur (par exemple, le disque est dĂ©sormais rempli).

Si count vaut zĂ©ro 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 ou si la dĂ©tection d’erreur n’est pas effectuĂ©e, 0 sera renvoyĂ© sans autre effet. Si count vaut zĂ©ro et fd est un fichier autre qu’un fichier ordinaire, les rĂ©sultats ne sont pas dĂ©finis.

ERREURS

EAGAIN

Le descripteur de fichier fd fait rĂ©fĂ©rence Ă  un fichier autre qu’un socket et a Ă©tĂ© marquĂ© comme non bloquant ( O_NONBLOCK ), et l’écriture devrait bloquer. Consultez open (2) pour plus de dĂ©tails sur l’attribut O_NONBLOCK .

EAGAIN ou EWOULDBLOCK

Le descripteur de fichier fd fait rĂ©fĂ©rence Ă  un fichier autre qu’un 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.

EDESTADDRREQ

fd fait rĂ©fĂ©rence Ă  un socket de datagramme pour lequel l’adresse du correspondant n’a pas Ă©tĂ© initialisĂ©e avec connect (2).

EDQUOT

Le quota de blocs de disque de l’utilisateur sur le systĂšme de fichiers contenant le fichier correspondant Ă  fd a Ă©tĂ© atteint.

EFAULT

buf pointe en dehors de l’espace d’adressage accessible.

EFBIG

Tentative d’écriture d’une plage dĂ©passant la taille maximale d’un fichier dĂ©finie par l’implĂ©mentation ou la limite de taille de fichier du processus, ou bien sur une position au-delĂ  de celle maximum autorisĂ©e.

EINTR

L’appel systĂšme a Ă©tĂ© interrompu par un signal avant d’avoir pu Ă©crire quoi que ce soit ; consultez 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 dĂ©finie dans buf , soit la valeur dĂ©finie dans count , soit la position dans le fichier ne sont pas alignĂ©es correctement.

EIO

Une erreur d’E/S de bas niveau est survenue pendant la modification de l’inƓud. Cette erreur peut ĂȘtre liĂ©e Ă  l’écriture en retour de donnĂ©es Ă©crites par un appel de write () antĂ©rieur qui peut ĂȘtre fournie pour un descripteur de fichier diffĂ©rent sur le mĂȘme fichier. Depuis Linux 4.13, les erreurs Ă  partir des Ă©critures en retour arrivent avec l’annonce qu’elles peuvent ĂȘtre signalĂ©es par des requĂȘtes ultĂ©rieures de write () et seront signalĂ©es par un appel de fsync ultĂ©rieur (qu’elles aient Ă©tĂ© ou non signalĂ©es par write ()). Une autre cause de EIO sur des systĂšmes de fichiers en rĂ©seau se produit quand un verrouillage coopĂ©ratif a Ă©tĂ© pris sur le descripteur de fichier et qu’il a Ă©tĂ© perdu. Consultez la section Verrouillages perdus de fcntl (2) pour plus de dĂ©tails.

ENOSPC

Le pĂ©riphĂ©rique correspondant Ă  fd n’a plus de place disponible.

EPERM

La lecture a été interrompue par un signal ; consultez fnctl (2).

EPIPE

fd est connectĂ© Ă  un tube (pipe) ou un socket dont l’extrĂ©mitĂ© de lecture est fermĂ©e. Quand cela 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 .

STANDARDS

POSIX.1-2008.

HISTORIQUE

SVr4, 4.3BSD, 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. Sur certains systĂšmes de fichiers, y compris NFS, elle ne garantit mĂȘme pas que l’espace suffisant a Ă©tĂ© rĂ©servĂ© pour les donnĂ©es. Dans certains cas, certaines erreurs pourraient ĂȘtre diffĂ©rĂ©es Ă  une prochaine invocation de write (), de fsync (2) ou mĂȘme de close (2). 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.

Dans Linux, write () et les appels systĂšmes analogues transfĂšrent au maximum 0x7ffff000 (2 147 479 552) octets, renvoyant le nombre d’octets rĂ©ellement transfĂ©rĂ©s. (Cela est vrai aussi bien sur les systĂšmes 32 bits que sur les systĂšmes 64 bits.)

Le renvoi d’une valeur d’erreur pendant l’exĂ©cution de write () utilisant les E/S directes ne signifie pas que la totalitĂ© de l’écriture a Ă©chouĂ©. Des donnĂ©es partielles ont pu ĂȘtre Ă©crites et les donnĂ©es Ă  la position pointĂ©e dans le fichier oĂč l’appel write () Ă©tait tentĂ© devraient ĂȘtre considĂ©rĂ©es comme incohĂ©rentes.

BOGUES

Selon POSIX.1-2008/SUSv4, Section XSI 2.9.7 ("Thread Interactions with Regular File Operations") :

Toutes les fonctions suivantes doivent ĂȘtre atomiques et ne pas se perturber mutuellement pour ce qui concerne les effets spĂ©cifiĂ©s dans POSIX.1-2008 lorsqu’elles opĂšrent sur les fichiers rĂ©guliers ou sur les liens symboliques : ...

write () et writev (2) figurent parmi les API listĂ©es par la suite. En outre, la mise Ă  jour du dĂ©calage de fichier fait partie des effets qui doivent ĂȘtre atomiques pour les threads (et pour les processus). Cependant, avant Linux 3.14, cela n’était pas le cas : si deux processus partageant un mĂȘme descripteur de fichier (consultez open (2)) effectuaient une action write () (ou writev (2)) simultanĂ©ment, alors les opĂ©ration E/S n’étaient pas atomiques pour ce qui concernait la mise Ă  jour du dĂ©calage de fichier. En consĂ©quence, les Ă©critures effectuĂ©es par les deux processus pouvaient se chevaucher au niveau des blocs de donnĂ©es (de façon incorrecte). Ce problĂšme a Ă©tĂ© rĂ©solu dans Linux 3.14.

VOIR AUSSI

close (2), fcntl (2), fsync (2), ioctl (2), lseek (2), open (2), pwrite (2), read (2), select (2), writev (2), fwrite (3)

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> 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 .