zápis (systémové volání) - write (system call)
Zápisu je jedním z nejzákladnějších rutiny poskytovaných Unix-like systému pracujícího jádra . Zapisuje data z vyrovnávací paměti deklarované uživatelem do daného zařízení, například do souboru. Toto je primární způsob výstupu dat z programu přímo pomocí systémového volání. Cíl je identifikován číselným kódem . Údaje , které mají být písemná, například kus textu, je definován ukazatel a velikostí, vzhledem k počtu bytů.
write
bere tedy tři argumenty:
- Kód souboru ( deskriptor souboru nebo fd ).
- Ukazatel na vyrovnávací paměť, kde jsou uložena data ( buf ).
- Počet bajtů pro zápis z vyrovnávací paměti ( nbytů ).
Použití POSIX
Rozhraní pro volání pro zápis je standardizováno specifikací POSIX. Data se zapisují do souboru voláním funkce write. Prototyp funkce je:
ssize_t write(int fd, const void *buf, size_t nbytes);
Argument | Popis |
---|---|
fd |
Je to deskriptor souboru, který byl získán z volání k otevření. Jedná se o celočíselnou hodnotu. Lze také zadat hodnoty 0, 1, 2 pro standardní vstup, standardní výstup a standardní chybu. |
buf |
Ukazuje na pole znaků s obsahem, který má být zapsán do souboru, na který ukazuje fd. |
nbytů |
Udává počet bajtů, které mají být zapsány z pole znaků do souboru, na který ukazuje fd. |
Ve výše uvedené syntaxi ssize_t
je a typedef
. Jedná se o podepsaný datový typ definovaný v stddef.h
. Všimněte si, že write()
nevrací hodnotu bez znaménka; vrací -1, pokud dojde k chybě, takže musí vrátit podepsanou hodnotu.
Funkce write vrací počet bajtů úspěšně zapsaných do souboru, který může být někdy menší než zadaný nbytů . Pokud dojde k výjimečnému stavu, vrátí hodnotu -1, viz část o chybách níže.
Příklad použití
#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;
}
Během provozu došlo k chybám
Níže jsou uvedeny některé chyby, se kterými se lze při zápisu do souboru setkat. Chyby jsou makra uvedená v errno.h .
Čísla chyb | Chyba | Význam |
---|---|---|
4 |
EINTR
|
Systémové volání bylo přerušeno. |
5 |
EIO |
Chyby nízké úrovně, často související s operacemi čtení/zápisu hardwaru. |
9 |
EBADF |
Deskriptor souboru fd není platný nebo probíhá pokus o zápis do souboru otevřeného v režimu jen pro čtení. |
13 |
EACCES
|
Uživatel nemá potřebná oprávnění k zápisu do souboru. |
14 |
VÝCHOZÍ |
Adresa uvedená ve funkci je neplatná adresa. |
22 |
EINVAL |
Argumenty předané s funkcí jsou neplatné. |
27 |
EFBIG
|
Velikost souboru zadaná v nbajtech je příliš velká a je větší, než povoluje systém. |
28 |
ENOSPC |
Pro zápis na úložné zařízení není k dispozici žádné místo. |
32 |
EPIPE
|
Potrubí je buď přerušeno, nebo soubor na druhém konci potrubí není otevřen pro účely I/O (většina procesů poskytujících tento typ chyby generuje také signál SIGPIPE ). |
Funkce I/O vyšší úrovně volání zápisu
Navzdory blízké podobnosti není systémové volání write běžnou funkcí. Například v Linuxu s architekturou x86 používá systémové volání k přenosu kontroly na jádro instrukci INT 80H. Systémové volání pro zápis a jeho protějšek pro čtení , které jsou funkcemi nízké úrovně, jsou schopné porozumět pouze bytům . Zápis nelze použít k zápisu záznamů, jako jsou třídy . Proto jsou vyžadovány vyšší úrovně vstupně-výstupních funkcí (jako printf ). Ve srovnání s přeplněným rozhraním nízké úrovně je často upřednostňováno rozhraní na vysoké úrovni. Tyto funkce interně volají další funkce a ty zase mohou volat k zápisu, což vede k vrstvenému sestavení funkcí.
S využitím této sestavy mohou funkce vyšší úrovně shromažďovat bajty dat a poté zapisovat požadovaná data do souboru.
Viz také
Reference
externí odkazy
- POSIX zápis
- C_Programming/C_Reference/stdio.h/fwrite ve Wikibooks