Provided by: manpages-fr-dev_4.26.0-1_all bug

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.

Pages du manuel de Linux 6.9.1                     2 mai 2024                                           write(2)