C Programovanie

Funkcia čítania POSIX v programovaní C

Funkcia čítania POSIX v programovaní C
V tradičných operačných systémoch kompatibilných s POSIX na získanie informácií z dokumentu obsiahnutého v súborovom systéme použil program načítanie systémového volania. Deskriptor dokumentu, ku ktorému sa zvyčajne pristupuje z predchádzajúcej výzvy na otvorenie, je definovaný súborom. Toto prečítané systémové volanie prečíta informácie v bajtoch a celé číslo, ktoré volajúci zadá z dokumentu, a potom ich uloží do medzipamäte poskytnutej volajúcim mechanizmom.

Definícia funkcie

Pred definovaním funkcie čítania vo vašom kóde musíte zahrnúť niektoré požadované balíčky.

#include

Takto definujete funkciu čítania 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 volania metódy read možno prevziať tri argumenty parametrov:

int fd: Deskriptor súboru, z ktorého sa majú informácie načítať. Mohli by sme buď používať deskriptor súborov získaný prostredníctvom otvoreného systémového volania, alebo by sme mohli použiť iba 0, 1 alebo 2 odkazujúce na typický vstup, bežný výstup alebo bežnú chybu.

Zrušiť * buf: Vyrovnávacia pamäť alebo pole znakov, do ktorého by sa mali načítané údaje ukladať a uchovávať.

Veľkosť_t nbyte: Počet bajtov, ktoré bolo potrebné načítať z dokumentu pred skrátením. Všetky informácie možno uložiť do medzipamäte, ak sú informácie na čítanie kratšie ako nbytov.

Popis

Metóda read () sa pokúša načítať bajty „nbyte“ do medzipamäte vyrovnávacej pamäte označenej ako „buf“ buď zo súboru spojeného s deskriptorom otvoreného dokumentu „Fildes“ alebo „fd“. Nedefinuje povahu niekoľkých simultánnych čítaní na rovnakom streame, FIFO alebo koncovej jednotke.

Na dokumentoch, ktoré umožňujú čítanie, sa proces čítania začína od posunu dokumentu a posun sa zvyšuje o počet prečítaných bajtov. Ak je odsadenie dokumentu na okraji súboru alebo za ním, neexistujú žiadne prečítané bajty a funkcia read () neposkytuje žiadne.

Keď je počet 0, funkcia read () rozpozná chyby uvedené nižšie. Ak nedôjde k žiadnym chybám alebo ak sa read () s chybami nezohľadní, read () prinesie nulu s počtom 0, a preto nemá žiadne ďalšie následky.

Ak je počet vyšší ako SSIZE_MAX, podľa POSIX.1, potom je výsledok určený implementáciou.

Návratová hodnota

Počet bajtov „prečítaných“ a „pread“ vrátených po dosiahnutí výsledku musí byť nezáporné celé číslo, zatiaľ čo nula ukazuje na koniec súboru. O toto číslo sa pozícia dokumentu posúva, alebo inak, na označenie chyby metódy vrátia hodnotu -1 a priradí „errno“. Ak je tento údaj menší ako požadovaný počet bajtov, nejde o chybný bajt. Je možné, že zatiaľ je k dispozícii menej bajtov.

Chyby

Funkcia pread a read bude neúspešná, ak sa vyskytnú tieto chyby:

EAGAIN:

Deskriptor dokumentu alebo súboru „fd“ patrí do súboru bez soketu, ktorý bol označený ako neblokujúci (O NONBLOCK) a zablokuje čítanie.

EWOULDBLOCK:

Deskriptor „fd“ patrí do soketu, ktorý bol označený ako neblokujúci (O_NONBLOCK) a bude blokovať čítanie.

EBADF:

„Fd“ nemusí byť použiteľný deskriptor alebo nemusí byť otvorený na čítanie.

VÝCHODISKO:

To sa stane, keď je váš bufet mimo váš dosiahnuteľný adresný priestor.

EINTR:

Pred načítaním informačných údajov sa hovor mohol prerušiť signálom.

EINVAL:

Táto chyba sa vyskytuje, keď je váš deskriptor „fd“ zapojený do objektu, ktorý nie je vhodný na čítanie, alebo bol dokument rozviazaný s príznakom O_DIRECT a jednou alebo druhou adresou uvedenou v parametri „buf“, hodnota uvedená v „count“ ', alebo nie je správne priradený ofset dokumentu.

EINVAL:

Deskriptor „fd“ mohol byť vytvorený pomocou volania timerfd_create (2) a na čítanie bola zadaná nesprávna veľkosť vyrovnávacej pamäte.

EIO:

Je to chyba vstupu / výstupu. Vyskytuje sa to, keď sa skupina procesov na pozadí pokúša čítať zo svojho regulačného terminálu a jeden alebo druhý prehliada alebo blokuje SIGTTIN, alebo ak je jeho skupina procesov zbavená zodpovednosti. Ďalším dôvodom tejto chyby môže byť chyba vstupu / výstupu na nízkej úrovni pri načítaní z pevného disku alebo pásky. Ďalšou možnou príčinou EIO v sieťových dátových súboroch je odstránenie poradného blokovania v deskriptore súborov a porucha tohto zámku.

EISDIR:

Deskriptor súborov „fd“ patrí do adresára.

Poznámky:

Môže sa vyskytnúť aj mnoho ďalších chýb, závislých od objektu spojeného s deskriptorom „fd“. Formáty size_t aj ssize_t sú neoznačené a označené číselné dátové typy definované programom POSIX.1. V systéme Linux možno preniesť najviac 0x7ffff000 (2 147 479 552) bajtov pomocou funkcie čítania (a ekvivalentných systémových volaní), čím sa vráti počet pôvodne prenesených bajtov (na 32-bitovej aj 64-bitovej platforme). So súborovými systémami NFS je to len prvý okamih, keď sa časová značka zmení načítaním malých tokov informácií, následné volania by to neurobili. Spúšťa sa ukladaním atribútov na strane klienta do medzipamäte, pretože aj keď nie všetci, klienti NFS ukončia aktualizáciu na server prostredníctvom st_atime (posledný čas prístupu k súboru) a čítania na strane klienta splnené z medzipamäte klienta nespustia zmeny st- atime na serveri, pretože nie sú k dispozícii žiadne údaje na strane servera. Odstránením medzipamäte atribútov na strane klienta možno získať prístup k metadátam systému UNIX, čo by však výrazne zvýšilo zaťaženie servera a vo väčšine prípadov ovplyvnilo produktivitu.

Príklad 01:

Tu je program C na demonštráciu volania funkcie čítania v systéme Linux. Napíšte nasledujúci príkaz, pretože je do nového súboru. Pridajte knižnice a v hlavnej funkcii inicializujte deskriptor a veľkosť. Deskriptor otvára súbor a na načítanie údajov zo súboru sa použije veľkosť.

Výstup pre vyššie uvedený kód by bol uvedený na nasledujúcom obrázku.

Príklad 02:

Ďalší príklad na ilustráciu fungovania funkcie čítania je uvedený nižšie.

Vytvorte ďalší súbor a nižšie uvedený kód si zapíšte tak, ako je. Tu sú dva deskriptory, fd1 a fd2, ktoré majú vlastný prístup k súborom otvorenej tabuľky. Takže pre foobar.txt, každý deskriptor má svoje umiestnenie súboru. Úplne prvý bajt foobaru.txt je preložený z fd2 a výsledok je c = f, nie c = o.

Záver

Funkciu čítania POSIX v programovaní C sme čítali efektívne. Dúfajme, že nezostanú žiadne pochybnosti.

Napodobňovanie kliknutí myšou vznášaním sa pomocou myši bez myši vo Windows 10
Používanie myši alebo klávesnice v nesprávnom postoji k nadmernému používaniu môže mať za následok veľa zdravotných problémov vrátane napätia, syndróm...
Pridajte gestá myši do systému Windows 10 pomocou týchto bezplatných nástrojov
V posledných rokoch sa počítače a operačné systémy veľmi vyvinuli. Boli časy, keď používatelia museli prechádzať správcami súborov pomocou príkazov. R...
Ovládajte a spravujte pohyb myši medzi viacerými monitormi v systéme Windows 10
Správca myši s duálnym displejom umožňuje ovládať a konfigurovať pohyb myši medzi viacerými monitormi spomalením jeho pohybu blízko hranice. Windows 1...