write(2) System Calls Manual write(2) NOM write - Ecrire dans un descripteur de fichier BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include ssize_t write(int fd, const void buf[.count], size_t count); DESCRIPTION write() ecrit au maximum count octets dans le tampon demarrant a buf dans le fichier reference par le descripteur de fichier fd. Le nombre d'octets ecrits peut etre inferieur a count par exemple si la place disponible sur le media 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 apres avoir ecrit moins de count octets. (Consultez aussi pipe(7).) Pour un fichier sur lequel lseek(2) est possible (par exemple un fichier ordinaire), l'ecriture a lieu a la position pointee dans le fichier, et elle est deplacee du nombre d'octets effectivement ecrits. Si le fichier etait ouvert par open(2) avec O_APPEND, la position pointee est fixee d'abord a la fin du fichier avant l'ecriture. La modification de la position et l'ecriture sont effectuees de facon atomique. POSIX reclame qu'une lecture avec read(2) effectuee de facon averee apres le retour d'une ecriture avec write(), renvoie les nouvelles donnees. Notez que tous les systemes de fichiers ne sont pas compatibles avec POSIX. Selon POSIX.1, si count est superieur a SSIZE_MAX, le resultat est defini par l'implementation ; consultez NOTES pour la limite superieure dans Linux. VALEUR RENVOYEE En cas de succes, le nombre d'octets ecrits est renvoye. Si cet appel systeme echoue, il renvoie -1 et errno est defini pour indiquer l'erreur. Il faut remarquer qu'un appel write() reussi peut transferer moins que count octets. Ces ecritures partielles peuvent se produire pour diverses raisons, par exemple, a cause d'un espace insuffisant dans le peripherique disque pour ecrire tous les octets demandes, ou a cause d'un write() bloque pour un socket, un tube ou similaire, etait interrompu par un gestionnaire de signal apres un transfert partiel, mais avant le transfert de tout les octets demandes. Dans l'eventualite d'une ecriture partielle, l'appelant peut faire un autre appel write() pour transferer les octets restants. Cet appel consecutif transfere les octets supplementaires ou peut aboutir a une erreur (par exemple, le disque est desormais rempli). Si count vaut zero et si fd correspond a un fichier ordinaire, write() peut renvoyer un code d'erreur si l'une des erreurs ci-dessous est detectee. Si aucune erreur n'est detectee ou si la detection d'erreur n'est pas effectuee, 0 sera renvoye sans autre effet. Si count vaut zero et fd est un fichier autre qu'un fichier ordinaire, les resultats ne sont pas definis. ERREURS EAGAIN Le descripteur de fichier fd fait reference a un fichier autre qu'un socket et a ete marque comme non bloquant (O_NONBLOCK), et l'ecriture devrait bloquer. Consultez open(2) pour plus de details sur l'attribut O_NONBLOCK. EAGAIN ou EWOULDBLOCK Le descripteur de fichier fd fait reference a un fichier autre qu'un socket et a ete marque comme non bloquant (O_NONBLOCK), et l'ecriture 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 meme valeur. Une application portable devrait donc tester les deux possibilites. EBADF fd n'est pas un descripteur de fichier valable, ou n'est pas ouvert en ecriture. EDESTADDRREQ fd fait reference a un socket de datagramme pour lequel l'adresse du correspondant n'a pas ete initialisee avec connect(2). EDQUOT Le quota de blocs de disque de l'utilisateur sur le systeme de fichiers contenant le fichier correspondant a fd a ete atteint. EFAULT buf pointe en dehors de l'espace d'adressage accessible. EFBIG Tentative d'ecriture d'une plage depassant la taille maximale d'un fichier definie par l'implementation ou la limite de taille de fichier du processus, ou bien sur une position au-dela de celle maximum autorisee. EINTR L'appel systeme a ete interrompu par un signal avant d'avoir pu ecrire quoi que ce soit ; consultez signal(7). EINVAL fd correspond a un objet sur lequel il est impossible d'ecrire, ou bien le fichier a ete ouvert avec l'attribut O_DIRECT, et soit l'adresse definie dans buf, soit la valeur definie dans count, soit la position dans le fichier ne sont pas alignees correctement. EIO Une erreur d'E/S de bas niveau est survenue pendant la modification de l'inoeud. Cette erreur peut etre liee a l'ecriture en retour de donnees ecrites par un appel de write() anterieur qui peut etre fournie pour un descripteur de fichier different sur le meme fichier. Depuis Linux 4.13, les erreurs a partir des ecritures en retour arrivent avec l'annonce qu'elles peuvent etre signalees par des requetes ulterieures de write() et seront signalees par un appel de fsync ulterieur (qu'elles aient ete ou non signalees par write()). Une autre cause de EIO sur des systemes de fichiers en reseau se produit quand un verrouillage cooperatif a ete pris sur le descripteur de fichier et qu'il a ete perdu. Consultez la section Verrouillages perdus de fcntl(2) pour plus de details. ENOSPC Le peripherique correspondant a fd n'a plus de place disponible. EPERM La lecture a ete interrompue par un signal ; consultez fnctl(2). EPIPE fd est connecte a un tube (pipe) ou un socket dont l'extremite de lecture est fermee. Quand cela se produit, le processus ecrivain recoit 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 associe a fd. STANDARDS POSIX.1-2008. HISTORIQUE SVr4, 4.3BSD, POSIX.1-2001. Sous SVr4, un appel write() peut etre interrompu, et renvoyer EINTR a n'importe quel moment, pas seulement avant l'ecriture des donnees. NOTES Une reussite de write() n'offre aucune garantie que les donnees se trouvent sur le disque. Sur certains systemes de fichiers, y compris NFS, elle ne garantit meme pas que l'espace suffisant a ete reserve pour les donnees. Dans certains cas, certaines erreurs pourraient etre differees a une prochaine invocation de write(), de fsync(2) ou meme de close(2). La seule maniere d'etre sur de la reussite est d'invoquer fsync(2) apres avoir ecrit les donnees. Si un write() est interrompu par un gestionnaire de signaux avant d'avoir ecrit quoi que ce soit, l'appel echoue avec EINTR ; s'il est interrompu apres avoir ecrit au moins un octet, l'appel reussit et renvoie le nombre d'octets ecrits. Dans Linux, write() et les appels systemes analogues transferent au maximum 0x7ffff000 (2 147 479 552) octets, renvoyant le nombre d'octets reellement transferes. (Cela est vrai aussi bien sur les systemes 32 bits que sur les systemes 64 bits.) Le renvoi d'une valeur d'erreur pendant l'execution de write() utilisant les E/S directes ne signifie pas que la totalite de l'ecriture a echoue. Des donnees partielles ont pu etre ecrites et les donnees a la position pointee dans le fichier ou l'appel write() etait tente devraient etre considerees comme incoherentes. BOGUES Selon POSIX.1-2008/SUSv4, Section XSI 2.9.7 ("Thread Interactions with Regular File Operations") : Toutes les fonctions suivantes doivent etre atomiques et ne pas se perturber mutuellement pour ce qui concerne les effets specifies dans POSIX.1-2008 lorsqu'elles operent sur les fichiers reguliers ou sur les liens symboliques : ... write() et writev(2) figurent parmi les API listees par la suite. En outre, la mise a jour du decalage de fichier fait partie des effets qui doivent etre atomiques pour les threads (et pour les processus). Cependant, avant Linux 3.14, cela n'etait pas le cas : si deux processus partageant un meme descripteur de fichier (consultez open(2)) effectuaient une action write() (ou writev(2)) simultanement, alors les operation E/S n'etaient pas atomiques pour ce qui concernait la mise a jour du decalage de fichier. En consequence, les ecritures effectuees par les deux processus pouvaient se chevaucher au niveau des blocs de donnees (de facon incorrecte). Ce probleme a ete resolu 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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Frederic Hantrais et Jean- Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 write(2)