Section courante

A propos

Section administrative du site

WRITE

Écrire
C pour Unix unistd.h

Syntaxe

ssize_t write(int fildes, const void *buf, size_t nbyte);

Paramètres

Nom Description
fildes Ce paramètre permet d'indiquer le descripteur de fichier où les données doivent être écrites. Il peut correspondre à un fichier ouvert (open), un tube (pipe), un socket (socket), ou encore une sortie standard (STDOUT_FILENO, STDERR_FILENO).
buf Ce paramètre permet d'indiquer un pointeur vers un tampon contenant les données à écrire. Les nbyte premiers octets du tampon seront écrits.
nbyte Ce paramètre permet d'indiquer le nombre d'octets à écrire à partir du tampon buf. write essaie d'écrire exactement nbyte octets, mais il est possible que moins d'octets soient écrits (en raison d'une interruption système ou d'un espace insuffisant dans le fichier ou le tampon du périphérique). La valeur de retour permet de vérifier combien d'octets ont effectivement été écrits.

Retour

En cas de réussite, ces fonctions renvoient le nombre d'octets réellement écrits dans le fichier associé à fildes. Ce nombre ne doit jamais être supérieur à nbyte. Sinon, la valeur -1 est renvoyée et errno est défini pour indiquer l'erreur.

Description

Cette fonction permet d'effectuer des écritures dans un fichier précédemment ouvert.

Remarques

Erreurs

Ces fonctions échoueront si :

Constante Description
EAGAIN Le fichier n'est ni un tube, ni une FIFO, ni un socket, l'indicateur O_NONBLOCK est activé pour le descripteur de fichier et le processus léger serait retardé dans l'opération write().
EBADF Le paramètre fildes n'est pas un descripteur de fichier valide ouvert en écriture.
EFBIG Une tentative d'écriture d'un fichier excède la taille maximale définie par l'implémentation ou la limite de taille de fichier du processus, et il n'y avait plus de place pour écrire des octets.
EFBIG Le fichier est un fichier standard, nbyte est supérieur à 0 et la position de départ est supérieure ou égale au déplacement maximal défini dans la description du fichier ouvert associée à fildes.
EINTR L'opération d'écriture a été interrompue suite à la réception d'un signal et aucune donnée n'a été transférée.
EIO Le processus est membre d'un groupe de processus d'arrière-plan et tente d'écrire sur son terminal de contrôle. TOSTOP est activé, le processus léger appelant ne bloque pas SIGTTOU, le processus n'ignore pas SIGTTOU et le groupe de processus du processus est orphelin. Cette erreur peut également être renvoyée dans des conditions définies par l'implémentation.
ENOSPC Il n'y avait plus d'espace libre sur le périphérique contenant le fichier.
ERANGE La taille de la requête de transfert était hors de la plage prise en charge par le fichier STREAMS associé à fildes.
EAGAIN Le fichier est un tube ou une FIFO, l'indicateur O_NONBLOCK est activé pour le descripteur de fichier et le processus léger serait retardé dans l'opération d'écriture.
EAGAIN ou EWOULDBLOCK Le fichier est un socket, l'indicateur O_NONBLOCK est activé pour le descripteur de fichier et le processus léger serait retardé dans l'opération d'écriture.
ECONNRESET Une tentative d'écriture a été effectuée sur un socket non connecté.
EPIPE Tentative d'écriture dans un tube ou une FIFO qui n'est ouvert en lecture par aucun processus, ou dont une seule extrémité est ouverte. Un signal SIGPIPE doit également être envoyé au processus léger.
EPIPE Tentative d'écriture sur un socket fermé en écriture ou déconnecté. Dans ce dernier cas, si le socket est de type SOCK_STREAM, un signal SIGPIPE doit également être envoyé au processus léger.
EINVAL Le STREAM ou le multiplexeur référencé par fildes est lié (directement ou indirectement) en aval d'un multiplexeur.
EIO Une erreur d'entrée/sortie physique s'est produite.
ENOBUFS Les ressources disponibles sur le système étaient insuffisantes pour effectuer l'opération.
ENXIO Une requête a été effectuée sur un périphérique inexistant, ou la requête dépassait les capacités du périphérique.
ENXIO Un blocage s'est produit sur le flux en cours d'écriture. L'écriture dans un fichier STREAMS peut échouer si un message d'erreur a été reçu au niveau de la tête du flux. Dans ce cas, errno est défini sur la valeur incluse dans le message d'erreur.
EACCES Une tentative d'écriture a été effectuée sur un socket et le processus appelant ne dispose pas des privilèges appropriés.
ENETDOWN Une tentative d'écriture a été effectuée sur un socket et l'interface réseau locale utilisée pour atteindre la destination est indisponible.
ENETUNREACH Une tentative d'écriture a été effectuée sur un socket et aucune route vers le réseau n'est présente.

Exemple

L'exemple suivant écrit les données du tampon pointé par buf dans le fichier associé au descripteur de fichier fd :

  1. #include <sys/types.h>
  2. #include <string.h>
  3. ...
  4. char buf[20];
  5. size_t nbytes;
  6. ssize_t bytes_written;
  7. int fd;
  8. ...
  9. strcpy(buf, "Ceci est un test\n");
  10. nbytes = strlen(buf);
  11.  
  12.  
  13. bytes_written = write(fd, buf, nbytes);
  14. ...


Dernière mise à jour : Vendredi, le 5 Juin 2020