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:
- Filkoden ( filbeskrivelse eller fd ).
- Markøren til en buffer, hvor dataene er gemt ( buf ).
- 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_t
er 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
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
- POSIX skrive
- C_Programming/C_Reference/stdio.h/fwrite på Wikibooks