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:

  1. Kód souboru ( deskriptor souboru nebo fd ).
  2. Ukazatel na vyrovnávací paměť, kde jsou uložena data ( buf ).
  3. 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_tje 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

High-level I/O functions calling write

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