Zápis (systémové volání) - Write (system call)
The psát si je jedním z nejzákladnějších rutiny poskytl a Unixový operační systém jádro. 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římým použitím systémového volání. Cíl je označen a číselný kód. The data být napsán, například část textu, je definován a ukazatel a velikost uvedená v počtu bajtů.
psát si
tedy trvá tři argumenty:
- Kód souboru (deskriptor souboru nebo fd).
- Ukazatel na a nárazník kde jsou data uložena (buf).
- Počet bajtů k zápisu z vyrovnávací paměti (nbytů).
Použití POSIX
Rozhraní pro zápis volání[1][2][3] je standardizován specifikací POSIX. Data se zapisují do souboru voláním funkce zápisu. Prototyp funkce je:
ssize_t psát si(int fd, konst prázdnota *buf, size_t nbytů);
Argument | Popis |
---|---|
fd | Jedná se o deskriptor souboru, který byl získán z výzvy k otevření. Je to celočíselná hodnota. 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ů | Určuje 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 typedef
. Je to podepsaný datový typ definovaný v stddef.h
. Všimněte si, že psát si()
nevrací nepodepsanou hodnotu; vrátí -1, pokud dojde k chybě, takže musí vrátit podepsanou hodnotu.
Funkce write vrací počet bytů úspěšně zapsaných do pole, který může být někdy menší než zadaný nbytů. Vrátí -1, pokud dojde k výjimečné podmínce, viz část na chyby níže.
Příklad použití
#zahrnout <stdio.h>#zahrnout <string.h>#zahrnout <stdlib.h>#zahrnout <fcntl.h>#zahrnout <unistd.h>int hlavní (int argc, char *argv[]){ int fd1; char buf[128]; fd1 = otevřeno(argv[1], O_WRONLY); -li (fd1 == -1) { hrůza(argv[1]); vrátit se EXIT_FAILURE; } / * Zadejte data, která mají být zapsána do souboru * / skenování(„% 127 s“, buf); psát si(fd1, buf, strlen(buf)); / * fd1 je deskriptor souboru, buf je znakové pole zvyklé držet data, strlen (buf) informuje funkci, že počet bajtů se rovná délce řetězec ve vyrovnávací paměti je třeba zkopírovat * / zavřít(fd1); vrátit se 0;}
Během provozu došlo k chybám
Níže jsou uvedeny některé chyby[4][5] na které lze narazit během zápisu do souboru. 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ě, které se často týkají operací čtení a zápisu hardwaru. |
9 | EBADF | Deskriptor souboru fd není platný nebo dochází k pokusu 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 zadaná ve funkci je neplatná adresa. |
22 | EINVAL | Argumenty předané s funkcí jsou neplatné. |
27 | EFBIG | Velikost souboru uvedená v nbytů je příliš velký a je větší, než umožňuje systém. |
28 | ENOSPC | Pro zápis na úložné zařízení není k dispozici místo. |
32 | EPIPE | Kanál je buď rozbitý, nebo soubor na druhém konci kanálu není otevřen pro I / O účely (většina procesů poskytujících tento typ chyby také generuje SIGPIPE signál). |
Vyšší I / O funkce volající zápis
Systémové volání zápisu není běžnou funkcí, navzdory blízké podobnosti. Například v Linuxu s x86 architektura, systémové volání používá instrukci INT 80H, aby se přenesla kontrola do jádra.[6] Systémové volání zápisu a jeho protějšek číst, protože jsou funkce nízké úrovně, jsou schopni pouze porozumět bajtů. Zápis nelze použít k zápisu záznamů, jako třídy. Vyšší úroveň vstupně-výstupních funkcí (jako printf ) jsou potřeba. Často je upřednostňováno rozhraní na vysoké úrovni ve srovnání s rozhraním na nízké úrovni. Tyto funkce interně volají jiné funkce a tyto zase mohou provádět volání k zápisu, což vede k vrstvené sestavě funkcí.[7][8]
Pomocí tohoto sestavení mohou funkce na vyšší úrovni shromažďovat bajty dat a poté zapisovat požadovaná data do souboru.

Viz také
Reference
- ^ http://www.unix.com/man-page/FreeBSD/2/write/ Ruční stránka pro zápis
- ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives Primitivní I / O
- ^ http://pubs.opengroup.org/onlinepubs/007904875/functions/write.html
- ^ https://www.gnu.org/s/hello/manual/libc/Error-Codes.html Manuál knihovny GNU C
- ^ http://www.ibm.com/developerworks/aix/library/au-errnovariable/ Chyby se seznamem stránek IBM
- ^ Programování jazyka LINUX v montážním jazyce Bob Neveln ISBN 978-0-13-087940-0
- ^ https://www.gnu.org/s/libc/ Knihovna GNU C.
- ^ http://ftp.gnu.org/gnu/glibc/ Stažení knihovny GNU C