Scroll to navigation

write(2) System Calls Manual write(2)

NAAM

write - schrijf naar een bestandsindicator

BIBLIOTHEEK

Standard C bibliotheek (libc, -lc)

SAMENVATTING

#include <unistd.h>
ssize_t write(int fd, const void buf[.count], size_t tel);

BESCHRIJVING

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.

EIND WAARDE

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.

FOUTEN

De file beschrijving bi wijst naar een ander bestand dan een socket en is gemarkeerd als niet-blokkerend (O_NONBLOCK), en de schrijf aanroep zou blokkeren. Zie open(2) voor meer details over de O_NONBLOCK vlag.
De file beschrijving bi wijst naar een ander bestand dan een socket en is gemarkeerd als niet-blokkerend (O_NONBLOCK), en de schrijf aanroep zou blokkeren. Zie open(2) voor meer details over de O_NONBLOCK vlag. POSIX.1-2001 staat toe in dit geval een fout terug te geven, en vereist niet dat deze constanten dezelfde waarde hebben, daarom moet een overdraagbare applicatie op beide mogelijkheden controleren.
bi is geen geldige bestandsindicator, of is niet open voor lezen.
bi wijst naar een datagram socket waarvoor een gelijk adres niet ingesteld werd gebruikmakend van connect(2).
De quota van de gebruiker van schijf blokken op het bestandssysteem bevattende het bestand aangewezen door bi is opgebruikt.
buf ligt buiten de door u toegankelijke adres ruimte.
Een poging werd ondernomen om een bestand te schrijven dat de implementatie-bepaalde maximum bestand grootte of een proces bestand grootte limiet overschrijd, of naar een schrijf actie bij een positie voorbij de maximaal toegestane positie.
De aanroep werd onderbroken door een signaal voordat gegevens werden geschreven; zie signal(7).
bi is gekoppeld aan een object dat ongeschikt is om naar te schrijven; of het bestand werd geopend met de O_DIRECT vlag, en ofwel het opgegeven adres in buf, de waarde opgegeven in count, of de bestandspositie is niet goed opgelijnd.
Een laag-niveau Invoer/Uitvoer fout trad op terwijl de inode veranderd werd. Deze fout kan gerelateerd zijn aan een schrijf-terug van gegevens geschreven door een eerdere write(), die kan zijn gedaan via een andere bestandsbeschrijving op hetzelfde bestand. Vanaf Linux 4.13, komen fouten van een schrijf-terug terug met de belofte dat ze gerapporteerd kunnen worden door volgende write() aanroepen en worden gerapporteerd door een volgende fsync(2) (al dan niet ook gerapporteerd door write()). Een alternatief geval van EIO op netwerk bestandssystemen is wanneer een geadviseerde lock werd verwijderd op de bestandsbeschrijving en als die lock verloren werd. Zie de Verloren Locks sectie van fcntl(2) voor meer details.
Het apparaat dat het bestand bevat waar bi naar wijst heeft geen ruimte voor de gegevens.
De operatie werd voorkomen door een bestandszegel; zie fcntl(2).
bi is verbonden met een pijp of socket waarvan de lees-uitgang gesloten is. Wanneer dit gebeurd ontvangt het schrijvende proces een SIGPIPE signaal; (Dus, de uitvoer waarde van de write wordt alleen gezien als het programma het signaal ontvangt, blokkeert of negeert.)

Andere fouten kunnen optreden afhankelijk van dat wat verbonden is met bi.

VOLDOET AAN

POSIX.1-2008.

GESCHIEDENIS

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.

OPMERKINGEN

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.

BUGS

Volgens POSIX.1-2008/SUSv4 Sectie XSI 2.9.7 ("Thread interacties met Reguliere Bestand Operaties"):

Alle volgende functie zullen onderling atomair zijn voor wat betreft de effecten die in POSIX.1-2008 gespecificeerd zijn indien ze werken op reguliere bestanden of symbolische koppelingen: ...

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.

ZIE OOK

close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2), read(2), select(2), writev(2), fwrite(3)

VERTALING

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.

3 april 2023 Linux man-pagina's 6.05.01