skriva (systemanrop) - write (system call)

Den skrivning är en av de mest grundläggande rutiner som tillhandahålls av en Unix-liknande operativsystem kärna . Den skriver data från en buffert som deklareras av användaren till en given enhet, till exempel en fil. Detta är det primära sättet att mata ut data från ett program genom att direkt använda ett systemanrop. Destinationen identifieras med en numerisk kod . De data som ska skrivas, till exempel ett stycke text, definieras av en pekare och en storlek som anges i antal byte.

write tar alltså tre argument:

  1. Filkoden ( filbeskrivning eller fd ).
  2. Pekaren till en buffert där data lagras ( buf ).
  3. Antalet byte som ska skrivas från bufferten ( nbytes ).

POSIX -användning

Gränssnittet för skrivsamtal är standardiserat av POSIX -specifikationen. Data skrivs till en fil genom att anropa skrivfunktionen. Funktionsprototypen är:

 ssize_t write(int fd, const void *buf, size_t nbytes);
Argument Beskrivning
fd
Det är filbeskrivningen som har hämtats från uppmaningen att öppna. Det är ett heltal. Värdena 0, 1, 2 kan också anges för standardingång, standardutgång respektive standardfel.
buf
Det pekar på en teckenmatris, med innehåll som ska skrivas till filen som pekas av fd.
nbytes
Den anger antalet byte som ska skrivas från teckenuppsättningen i filen som pekas av fd.

I syntaxen ovan ssize_tär a typedef. Det är en signerad datatyp som definieras i stddef.h. Observera att write()det inte returnerar ett osignerat värde; den returnerar -1 om ett fel uppstår så det måste returnera ett signerat värde.
Skrivfunktionen returnerar antalet byte som har skrivits in i filen, vilket ibland kan vara mindre än de angivna nbytesna . Det returnerar -1 om ett exceptionellt tillstånd uppstår, se avsnittet om fel nedan.

Användningsexempel

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main (int argc, char *argv[])
{
    int fd1;
    char buf[128];
    fd1 = open(argv[1], O_WRONLY);
    if (fd1 == -1) {
        perror(argv[1]);
        return EXIT_FAILURE;
    }

    /* Enter the data to be written into the file */
    scanf("%127s", buf);

    write(fd1, buf, strlen(buf)); /* fd1 is the file descriptor, buf is the character array used to
 hold the data, strlen(buf) informs the function that the number of bytes equal to the length of the
 string in the buffer need to be copied */

    close(fd1);

    return 0;
}

Fel som uppstått under drift

Nedan listas några fel som kan uppstå när du skriver till en fil. Felen är makron som listas i errno.h .

Felnummer Fel Menande
4
EINTR
Systemsamtalet avbröts.
5
EIO
Lågnivåfel, som ofta handlar om maskin- läs-/skrivoperationer.
9
EBADF
Filbeskrivningen fd är ogiltig, eller ett försök görs att skriva in i en fil som öppnas i lässkyddsläge.
13
EACCES
Användaren har inte nödvändiga behörigheter för att skriva in i filen.
14
EFAULT
Den adress som anges i funktionen är en ogiltig adress.
22
EINVAL
Argumenten / argumenten som skickas med funktionen är ogiltiga.
27
EFBIG
Filstorleken som anges i nbytes är för stor och är större än den som tillåts av systemet.
28
ENOSPC
Inget utrymme tillgängligt för att skriva till lagringsenheten.
32
EPIPE
Röret är antingen trasigt, eller så är filen i andra änden av röret inte öppen för I/O -ändamål (de flesta processer som ger denna typ av fel genererar också SIGPIPE -signalen ).

Högre nivå I/O -funktioner ringer skriva

I/O-funktioner på hög nivå som ringer skriv

Skrivsystemsamtalet är inte en vanlig funktion, trots den nära likheten. Till exempel i Linux med x86 -arkitekturen använder systemanropet instruktionen INT 80H för att överföra kontroll över till kärnan. Skrivsystemanropet, och dess motsvarighet läsa , vara låg nivå funktioner är endast kapabla att förstå byte . Skriv kan inte användas för att skriva poster, som klasser . Därför krävs inmatning-utgångsfunktioner på högre nivå (som printf ). Ofta är gränssnittet på hög nivå att föredra jämfört med det röriga lågnivågränssnittet. Dessa funktioner kallar andra funktioner internt, och dessa kan i sin tur ringa samtal för att skriva, vilket ger upphov till en lager av funktioner.

Med användning av denna enhet kan de högre nivåfunktionerna samla in byte med data och sedan skriva nödvändig data till en fil.

Se även

Referenser

externa länkar