C Programování

Funkce čtení POSIX v programování C

Funkce čtení POSIX v programování C
V tradičních operačních systémech kompatibilních s POSIX k získání informací z dokumentu obsaženého v souborovém systému použil program volání systémového čtení. Deskriptor dokumentu, ke kterému se obvykle přistupuje z předchozího volání k otevření, je definován souborem. Toto čtení systémového volání přečte informace v bajtech a celé číslo, které volající zadá z dokumentu, a poté je uloží do vyrovnávací paměti poskytované volajícím mechanismem.

Definice funkce

Před definováním funkce čtení ve vašem kódu musíte zahrnout některé povinné balíčky.

#zahrnout

Takto definujete funkci čtení POSIX:

>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);
>> ssize_t read (int fd, void * buf, size_t nbytes);

Z volání metody čtení lze převzít tři argumenty parametrů:

int fd: Deskriptor souboru, ze kterého se mají číst informace. Mohli bychom buď používat deskriptor souboru získaný prostřednictvím otevřeného systémového volání, nebo bychom mohli použít pouze 0, 1 nebo 2 s odkazem na typický vstup, běžný výstup nebo běžnou chybu.

Void * buf: Vyrovnávací paměť nebo pole znaků, do kterého by se měla číst data ukládat a uchovávat.

Velikost_t nbyte: Počet bajtů, které je třeba načíst z dokumentu před zkrácením. Všechny informace lze uložit do vyrovnávací paměti, pokud jsou informace ke čtení kratší než nbytů.

Popis

Metoda read () se pokusí načíst 'nbyte' bajtů do mezipaměti vyrovnávací paměti, na kterou odkazuje 'buf', buď ze souboru spojeného s deskriptorem otevřeného dokumentu 'Fildes' nebo 'fd'. Nedefinuje povahu několika současných čtení na stejném streamu, FIFO nebo terminální jednotce.

U dokumentů, které umožňují čtení, proces čtení začíná na posunu dokumentu a posun se zvyšuje o počet přečtených bytů. Pokud je posunutí dokumentu na okraji souboru nebo za ním, neexistují žádné přečtené bajty a read () neposkytuje žádné.

Když je počet 0, read () rozpozná chyby uvedené níže. Pokud nedochází k žádným chybám nebo pokud se read () nezohledňuje s Errors, read () přináší nulu s počtem 0, a proto nemá žádné další důsledky.

Pokud je počet vyšší než SSIZE_MAX, podle POSIX.1, pak je výsledek určen implementací.

Návratová hodnota

Počet bajtů „přečteno“ a „pread“ vrácených po dosažení výsledku musí být nezáporné celé číslo, zatímco nula ukazuje na konec souboru. Pozice dokumentu je posunuta o toto číslo, nebo jinak, k označení chyby vrátí metody -1 a přiřadí 'errno'. Pokud je tento údaj menší než požadovaný počet bajtů, nejedná se o chybný bajt. Je možné, že prozatím je k dispozici méně bytů.

Chyby

Funkce pread a read budou neúspěšné, pokud dojde k těmto chybám:

EAGAIN:

Deskriptor dokumentu nebo souboru „fd“ patří do souboru bez soketu, který byl označen jako neblokující (O NONBLOCK) a bude blokovat čtení.

EWOULDBLOCK:

Deskriptor 'fd' patří do soketu, který byl označen jako neblokující (O_NONBLOCK) a bude blokovat čtení.

EBADF:

„Fd“ nemusí být použitelný deskriptor nebo nemusí být otevřený ke čtení.

VÝCHOZÍ:

To se stane, když je váš „buf“ mimo dosažitelný adresní prostor.

EINTR:

Před načtením informačních dat se hovor mohl přerušit signálem.

EINVAL:

K této chybě dochází, když je váš deskriptor „fd“ zapojen do objektu, který není vhodný ke čtení, nebo byl dokument rozvázán s příznakem O_DIRECT a jedna nebo druhá adresa uvedená v „buf“, hodnota uvedená v „count ', nebo není správně přiřazen offset dokumentu.

EINVAL:

Deskriptor „fd“ mohl být vytvořen pomocí volání timerufd_create (2) a ke čtení byla dána nesprávná velikost vyrovnávací paměti.

EIO:

Jedná se o chybu vstupu / výstupu. Dochází k tomu, když se skupina procesů na pozadí pokouší číst ze svého regulačního terminálu a jeden nebo druhý přehlíží nebo blokuje SIGTTIN, nebo je jeho skupina procesů pohlcena. Dalším důvodem této chyby může být nízkoúrovňová chyba vstupu / výstupu při čtení z pevného disku nebo pásky. Další potenciální příčinou EIO u síťových datových souborů je odstranění poradního blokování na deskriptoru souboru a selhání tohoto zámku.

EISDIR:

Deskriptor souboru „fd“ patří do adresáře.

Poznámky:

Může také dojít k mnoha dalším chybám, závislých na objektu spojeném s deskriptorem 'fd'. Formáty size_t i ssize_t jsou neoznačené a označené číselné datové typy definované POSIXem.1. V systému Linux lze přenášet maximálně 0x7ffff000 (2 147 479 552) bajtů pomocí funkce čtení (a ekvivalentních systémových volání), čímž se vrátí počet původně přenesených bajtů (na 32bitové i 64bitové platformě). U souborových systémů NFS je to první okamžik, kdy se časová známka změní čtením malých proudů informací, následná volání by tak neučinila. Spouští se ukládáním atributů na straně klienta do mezipaměti, protože i když ne všichni, klienti NFS ukončí aktualizaci na server prostřednictvím st_atime (čas přístupu k poslednímu souboru) a čtení na straně klienta splněná z vyrovnávací paměti klienta by nespustila změny st- atime na serveru, protože nejsou k dispozici žádné údaje na straně serveru. Odebráním ukládání atributů na straně klienta do mezipaměti lze přistupovat k metadatům systému UNIX, ale to by výrazně zvýšilo zatížení serveru a ve většině případů to ovlivnilo produktivitu.

Příklad 01:

Zde je program C, který demonstruje volání funkce čtení v systému Linux. Napište níže uvedený příkaz do nového souboru. Přidejte knihovny a v hlavní funkci inicializujte deskriptor a velikost. Deskriptor otevírá soubor a velikost se používá ke čtení dat ze souboru.

Výstup pro výše uvedený kód bude takový, jak je znázorněno na následujícím obrázku.

Příklad 02:

Další příklad pro ilustraci fungování funkce čtení je uveden níže.

Vytvořte další soubor a zapište si níže uvedený kód tak, jak je. Zde jsou dva deskriptory, fd1 a fd2, které oba mají vlastní přístup k souborům otevřené tabulky. Takže pro foobar.txt, každý deskriptor má své umístění souboru. Úplně první bajt foobaru.txt je přeloženo z fd2 a výsledek je c = f, ne c = o.

Závěr

Funkci čtení POSIX v programování C jsme přečetli efektivně. Doufejme, že nezbyly žádné pochybnosti.

Hry HD remasterované hry pro Linux, které nikdy dříve neměly vydání Linuxu
HD remasterované hry pro Linux, které nikdy dříve neměly vydání Linuxu
Mnoho vývojářů a vydavatelů her přichází s HD remasterem starých her, aby prodloužili životnost franšízy, prosím fanoušky, kteří požadují kompatibilit...
Hry Jak používat AutoKey k automatizaci linuxových her
Jak používat AutoKey k automatizaci linuxových her
AutoKey je nástroj pro automatizaci stolních počítačů pro systémy Linux a X11, programovaný v programech Python 3, GTK a Qt. Pomocí jeho funkcí skript...
Hry Jak zobrazit počítadlo FPS v linuxových hrách
Jak zobrazit počítadlo FPS v linuxových hrách
Hraní na Linuxu získalo velký tlak, když společnost Valve v roce 2012 oznámila podporu systému Linux pro klienta Steam a jejich hry. Od té doby se mno...