write(2)

NAVN
write - skriv til en fildeskriptor

BIBLIOTEK
C-standardbibliotek (libc, -lc)

SYNOPSIS
#include <unistd.h>

ssize_t write(size_t count;
              int fd, const void buf[antal], size_t antal);

BESKRIVELSE
write() skriver op til antal byte fra bufferen startende ved buf til filen refereret af fildeskriptoren fd.

Antallet af byte skrevet kan være mindre end antal hvis, for eksempel, der er utilstrækkelig plads på det underliggende fysiske medie, eller ressourcebegrænsningen RLIMIT_FSIZE rammes (se setrlimit(2)), eller kaldet blev afbrudt af en signalhåndtering efter der er skrevet mindre end antal byte. (Se også pipe(7).)

For en søgbar fil (dvs., en hvorpå lseek(2) kan anvendes, for eksempel en normal fil) sker skrivning ved filforskydningen, og filforskydningen øges trinvis med antallet af faktisk skrevne byte. Hvis filen var open(2)ed (åbnet) med O_APPEND, placeres filforskydningen først i slutningen af filen før skrivning. Justeringen af filforskydningen og skrive-operationen udføres som et atomar trin.

POSIX kræver at read(2), der er opstået efter en write(), har returneret de nye data. Bemærk at ikke alle filsystemer overholder POSIX.

Jævnfør POSIX.1, hvis antal er større end SSIZE_MAX, så er resultatet implementationsdefineret; se NOTES for den øvre grænse på Linux.

RETURVÆRDI
Ved succes, antallet af bye skrevet returneres. Ved fejl, -1 returneres og errno angives for at indikere fejlen.

Bemærk at en succesfuld write() kan overføre færre end antal byte. Sådanne delvise skrivninger kan opstå af forskellige årsager; for eksempel fordi der var utilstrækkelig plads på diskenheden til at skrive alle de anmodte byte, eller fordi en blokeret write() til en sokkel, datakanal eller lignende blev afbrudt af en signalhåndtering efter denne havde overført nogle, men før alle de anmodte byte var overført. I tilfælde af en delvis skrivning, kan kalderen lave endnu et write()-kald for at overføre de tilbageværende byte. Det følgende kald vil enten overføre yderligere byte eller medføre en fejl (f.eks. hvis disken nu er fyldt op).

Hvis antal er nul og fd referer til en normal fil, så kan write() returnere en fejlstatus hvis en af fejlene nedenfor registreres. Hvis ingen fejl registreres, eller fejlregistrering ikke udføres, så returneres 0 uden at have nogen anden effekt. Hvis antal er nul og fd refererer til en fil udover en normal fil, så angives resultaterne ikke.

FEJL

EAGAIN
    Fildeskriptoren fd referer til en fil udover en sokkel og er blevet markeret ikkeblokerende (O_NONBLOCK), og skrivningen blokerer. Se open(2) for yderligere detaljer om flaget O_NONBLOCK.

EAGAIN eller EWOULDBLOCK
    Fildeskriptoren fd referer til en sokkel og er blevet markeret ikkeblokerende (O_NONBLOCK), og skrivningen blokerer. POSIX.1-2001 tillader hverken at fejl returneres i dette tilfælde og kræver ikke at disse konstanter har den samme værdi, så et flytbart program skal tjekke for begge muligheder.

EBADF
    fd er ikke en gyldig fildeskriptor eller er ikke åben for skrivning.

EDESTADDRREQ
    fd referer til en datagramsokkel hvor en modpartadresse ikke er blevet angivet via connect(2).

EDQUOT
    Brugerens kvota af diskblokke på filsystemet indeholdende filen refereret til af fd er tom.

EFAULT
    buf er uden for dit tilgængelige adresserum.

EFBIG
    Et forsøg blev gjort på at skrive en fil, der er større end den implementationsdefinerede maksimale filstørrelse eller processens begræsning af filstørrelsen, eller der blev skrevet på en position udover den maksimale tilladte forskydning.

EINTR
    Kaldet blev afbrudt af et signal før data blev skrevet; se signal(7).

EINVAL
    fd er vedhæftet til et objekt, der ikke er egnet for skrivning; eller filen blev åbnet med flaget O_DIRECT og enten den angivne adresse i buf, værdien angivet i antal eller filforskydningen er ikke ordentlig justeret.

EIO En I/O-fejl på lavt niveau opstod under ændring af iknuden. Denne fejl kan relatere til skriv-tilbage af data skrevet af en tidligere write(), der kan have været udstedt til en anden fildeskriptor på den samme fil. Fra og med Linux 4.13 har fejl fra skriv-tilbage en lovning (promise) om at de kan blive rapporteret efterfølgende. write()-forespørgsler vil blive rapporteret efterfølgende af en fsync(2) (uanset om de også blev rapporteret af write()). Et alternativt tilfælde af EIO på netværksfilsystemer er når en rådgivende lås er udløst på fildeskriptoren og denne lås er mistet. Se Lost locks-afsnittet hos fcntl(2) for yderligere detaljer.

ENOSPC
    Enheden indeholdende filen refereret til af fd har ikke plads til dataene.

EPERM
    Operationen blev forhindret af en filforsegling; se fcntl(2).

EPIPE
    fd er forbundet til en datakanal eller sokkel hvis læseafslutning er lukket. Når dette sker vil skriveprocessen også modtaget et SIGPIPE-signal. (Returværdien for skrivningen ses derfor kun hvis programmet bryder ned, blokeres eller ignorerer dette signal).

Andre fejl kan opstå, afhængig af objektet forbundet til fd.

STANDARDER
POSIX.1-2024.

HISTORIK
SVr4, 4.3BSD, POSIX.1-2001.

Under SVr4 kan en skrivning blive afbrudt og returnere EINTR på ethvert punkt, ikke kun lige før data skrives.

NOTER
En succesfuld returnering fra write() sikrer ikke, at data er blevet overført til disken. På nogle filsystemer, inklusive NFS, garanterer det end ikke at plads er blevet reserveret for dataene. I dette tilfælde, kan nogle fejl blive forsinket indtil en fremtidig write(), fsync(2), eller endda close(2). Den eneste måde at være sikker er at kalde fsync(2), efter du har skrevet alle dine data.

Hvis en write() afbrydes af en signalhåndtering før byte skrives, så fejler kaldet med fejlbeskeden EINTR; hvis den afbrydes efter at mindst en byte er blevet skrevet, så lykkes kaldet og returnerer antallet af byte skrevet.

På Linux vil write() (og lignende systemkald) overføre højest 0x7ffff000 (2.147.479.552) byte, returnerende det faktiske antal overførte byte. (Dette sker på både 32-bit og 64-bit systemer).

En fejlreturværdi under udførelse af write() via direkte I/O betyder ikke at hele skrivningen er fejlet. Delvise data kan være skrevet og dataene ved filforskydningen hvorpå write() blev forsøgt skal anses for at være inkonsistente.

FEJL
Jævnfør POSIX.1-2008/SUSv4 sektion XSI 2.9-7 (»Thread Interactions with Regular File Operations«):

    Alle de følgende funktioner skal være atomare med respekt for hinanden i effekterne specificeret i POSIX.1-2008 når de arbejder på normale filer eller symbolske henvisninger: ...

Blandt API'eren efterfølgende vist er write() og writev(2). Og blandt effekterne der skal være atomare på tværs af tråde (og processer) er opdateringer af filforskydningen. Før Linux 3.14 var dette dog ikke tilfældet: hvis to processer, der deler en åben filbeskrivelse (se open(2)) udføre en write() (eller writev(2)) på samme tid, så var I/O-operationerne ikke atomare i forhold til at opdatere filforskydningen, med det resultat, at blokkene med dataresultaterne fra de to processer kan (ukorrekt) overlappe hinanden. Dette problem blev løst i Linux 3.14.

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

OVERSÆTTELSE
Oversættere af denne manual til dansk Joe Hansen <joedalton2@yahoo.dk>

Denne oversættelse er gratis dokumentation; læs GNU General Public License version 3 (https://www.gnu.org/licenses/gpl-3.0.html) eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR.

Hvis du støder på fejl i oversættelsen af ​​denne vejledning, skal du sende en besked til debian-l10n-danish@lists.debian.org.