write(2) | System Calls Manual | write(2) |
write - schrijf naar een bestandsindicator
Standard C bibliotheek (libc, -lc)
#include <unistd.h>
ssize_t write(int fd, const void buf[.count], size_t tel);
write() schrijft tot tel bytes naar het bestand waar bi naar wijst, van de buffer die begint op buf.
Het aantal geschreven bytes kan kleiner zijn dan tel als bijvoorbeeld er onvoldoende ruimte was op het onderliggende fysieke medium, of als de RLIMIT_FSIZE hulpbron limiet werd bereikt (zie setrlimit(2)), of als de aanroep werd geïnterrumpeerd door een signaal nadat het minder dan tel bytes geschreven had. (Zie ook pipe(7).)
In een doorzoekbaar bestand (m.a.w. een op welk lseek(2) toegepast kan worden, bijvoorbeeld een regulier bestand) wordt geschreven aan de bestandspositie, en de positie wordt verhoogd met het daadwerkelijk geschreven aantal bytes. Als het bestand geopen(2)d werd met O_APPEND. dan wordt de bestandspositie eerst gezet op het einde van het bestand voor schrijven. De aanpassing van de bestandspositie en de schrijf operatie worden in een ondeelbare stap gedaan.
POSIX eist dat een read(2) die bewijsbaar na een write() plaatsvindt de nieuwe gegevens oplevert. Merk op dat niet alle bestandsystemen voldoen aan POSIX.
Volgens POSIX.1 als tel groter is dan SSIZE_MAX dan is het resultaat implementatie afhankelijk; zie OPMERKINGEN voor de boven grens op Linux.
Bij success wordt het aantal geschreven bytes teruggegeven. Bij falen wordt -1 teruggegeven en errno wordt overeenkomstig gezet.
Merk op dat een succesvolle write() ook minder dan tel bytes kan overdragen. Zulke partiële schrijf resultaten kunnen optreden door diverse redenen; bij voorbeeld, omdat er niet genoeg ruimte op het schijf apparaat was om alle gevraagde bytes te schrijven, of omdat een geblokkeerde write() naar een socket, pijp, of vergelijkbaar werd onderbroken door een signaal nadat het enkele, maar voor dat het alle gevraagde bytes had geschreven. Als zulk een partieel schrijf resultaat optreedt dan kan de aanroeper een andere write() aanroepen om de resterende bytes over te dragen. Deze aanroep kan de resterende bytes overdragen of resulteren in een fout (b.v. de schijf is nu vol).
Als tel nul is en bi wijst naar een normaal bestand dan kan write() een fout status teruggeven als een van de hieronder gegeven fouten werd gedetecteerd. Als een fouten worden gedetecteerd of fout detectie is niet gedaan, dan wordt 0 teruggegeven zonder enig andere effect te veroorzaken. Als tel nul is en bi wijst naar een bestand anders dan een regulier bestand, dan zijn de resultaten onbepaald.
Andere fouten kunnen optreden afhankelijk van dat wat verbonden is met bi.
SVr4, 4.3BSD, POSIX.1-2001.
Under SVr4 kan een write op elk punt onderbroken worden en EINTR teruggeven, niet alleen voordat enige gegevens zijn geschreven.
De typen size_t en ssize_t zijn, respectively, gehele getal typen met of zonder teken zoals gespecificeerd door POSIX.1.
Een succesvolle terugkeer uit write() is geen garantie dat de gegevens zijn toegekend aan de schijf. Op sommige bestandssystemen, inclusief NFS, is het zelfs geen garantie dat de ruimte succesvol werd gereserveerd voor de gegevens. In dit geval, kunnen sommige fouten worden vertraagd tot een toekomstige write(), fsync(2), of zelfs close(2). De enige manier om zeker te zijn is door fsync(2) aan te roepen, nadat u klaar bent met het schrijven van alle gegevens.
Als een write() werd onderbroken door een signaal voordat enige bytes werden geschreven, dan zal de aanroep falen met de fout EINTR; als hij werd onderbroken nadat op zijn minst een byte werd geschreven, dan is de aanroep succesvol, en retourneert het aantal geschreven bytes.
Op Linux zal write() (en vergelijkbare systeem aanroepen) maximaal 0x7ffff000 (2,147,479,552) bytes overdragen, en het daadwerkelijk aantal geschreven bytes retourneren. (Dit is waar voor zowel 32-bit als 64-but systemen.)
Een foutmelding gedurende het uitvoeren van write() onder gebruik van directe Invoer/Uitvoer betekent niet dat de volledige schrijf actie faalde. Een deel van de gegevens kan zijn geschreven en de gegevens op de bestandspositie waar de write() werd geprobeerd dienen beschouwd te worden als inconsistent.
Volgens POSIX.1-2008/SUSv4 Sectie XSI 2.9.7 ("Thread interacties met Reguliere Bestand Operaties"):
Tussen de opeenvolgende API´s staan write() en writev(2). En tussen de effecten die atomair zouden moeten zijn langs threads (en processen) zijn de veranderingen in de bestandspositie. Echter op Linux voor versie 3.14 was dit niet het geval: als twee processen die een open bestandsindicator deelden (zie open(2)) een write() (or writev(2)) tegelijkertijd uitvoeren, dan zijn de Invoer/Uitvoer operaties niet atomair met betrekking tot het aanpassen van de bestandspositie, hetgeen kan resulteren in het kunnen overlappen van de gegevens blokken zoals geschreven door beide processen. Dit probleem werd opgelost in Linux 3.14.
close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2), read(2), select(2), writev(2), fwrite(3)
De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>
Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.
Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.
4 december 2022 | Linux man-pagina's 6.03 |