skrive (systemopkald) - write (system call)

Det skriver er en af de mest grundlæggende rutiner , som en Unix-lignende operativsystem kerne . Det skriver data fra en buffer, der er deklareret af brugeren til en given enhed, f.eks. En fil. Dette er den primære måde at udsende data fra et program ved direkte at bruge et systemopkald. Destinationen identificeres med en numerisk kode . De data, der skal skrives, f.eks. Et stykke tekst, defineres af en markør og en størrelse, angivet i antal bytes.

write tager derfor tre argumenter:

  1. Filkoden ( filbeskrivelse eller fd ).
  2. Markøren til en buffer, hvor dataene er gemt ( buf ).
  3. Antallet af bytes, der skal skrives fra bufferen ( nbytes ).

POSIX brug

Skriveopkaldsgrænsefladen er standardiseret af POSIX -specifikationen. Data skrives til en fil ved at kalde skrivefunktionen. Funktionsprototypen er:

 ssize_t write(int fd, const void *buf, size_t nbytes);
Argument Beskrivelse
fd
Det er filbeskrivelsen, der er hentet fra opkaldet til åbning. Det er en heltal værdi. Værdierne 0, 1, 2 kan også angives for henholdsvis standardindgang, standardudgang og standardfejl.
buf
Det peger på et tegn array, med indhold der skal skrives til filen peget på af fd.
nbytes
Det angiver antallet af bytes, der skal skrives fra tegnmatrixen til filen, der peges af fd.

I ovenstående syntaks ssize_ter a typedef. Det er en signeret datatype defineret i stddef.h. Bemærk, write()der ikke returnerer en usigneret værdi; den returnerer -1, hvis der opstår en fejl, så den skal returnere en signeret værdi. Skrivefunktionen
returnerer antallet af bytes, der er skrevet i filen, hvilket til tider kan være mindre end de angivne nbytes . Det returnerer -1, hvis der opstår en ekstraordinær tilstand, se afsnittet om fejl nedenfor.

Eksempel på brug

#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;
}

Fejl under drift

Nedenfor er vist nogle fejl, der kan opstå under skrivning til en fil. Fejlene er makroer opført i errno.h .

Fejlnumre Fejl Betyder
4
EINTR
Systemopkaldet blev afbrudt.
5
EIO
Fejl på lavt niveau, der ofte vedrører hardware læse/skrive operationer.
9
EBADF
Filbeskrivelsen fd er ikke gyldig, eller der gøres et forsøg på at skrive ind i en fil, der åbnes i 'skrivebeskyttet' tilstand.
13
EACCES
Brugeren har ikke de nødvendige tilladelser til at skrive ind i filen.
14
EFAULT
Den adresse, der er angivet i funktionen, er en ugyldig adresse.
22
EINVAL
Argumentet / argumenterne, der blev bestået med funktionen, er (er) ugyldige.
27
EFBIG
Filstørrelsen, der er angivet i nbytes, er for stor og er større end den tilladte af systemet.
28
ENOSPC
Der er ikke plads til at skrive på lagerenheden.
32
EPIPE
Røret er enten brudt, eller filen i den anden ende af røret er ikke åben til I/O -formål (de fleste processer, der giver denne type fejl, genererer også SIGPIPE -signalet).

Højere I/O -funktioner, der kalder skrive

I/O-funktioner på højt niveau, der kalder skrive

Skrivesystemopkaldet er ikke en almindelig funktion på trods af den tætte lighed. For eksempel i Linux med x86 -arkitekturen bruger systemopkaldet instruktionen INT 80H for at overføre kontrol over til kernen. Skrivesystemopkaldet og dets læste modstykke , der er funktioner på lavt niveau, er kun i stand til at forstå bytes . Skriv kan ikke bruges til at skrive optegnelser, f.eks. Klasser . Således er input-output-funktioner på højere niveau (som printf ) påkrævet. Ofte foretrækkes grænsefladen på højt niveau sammenlignet med den rodede grænseflade på lavt niveau. Disse funktioner kalder andre funktioner internt, og disse kan igen foretage opkald til at skrive, hvilket giver anledning til en lagdelt samling af funktioner.

Ved brug af denne samling kan funktioner på højere niveau indsamle bytes med data og derefter skrive de nødvendige data i en fil.

Se også

Referencer

eksterne links