Loading

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