Funkcia čítania POSIX v programovaní C.

Posix Read Function C Programing



V tradičných operačných systémoch kompatibilných s POSIX program na získanie informácií z dokumentu obsiahnutého v súborovom systéme použil systémové volanie na čítanie. Súbor definuje deskriptor dokumentu, ku ktorému sa obvykle pristupuje z predchádzajúceho hovoru na otvorenie. Toto systémové čítanie systému číta informácie v bajtoch a celých číslach, ktoré volajúci z dokumentu uvedie, a potom ich uloží do vyrovnávacej pamäte poskytovanej volacím mechanizmom.

Definícia funkcie

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







#zahrnúť

Tu je návod, ako definujete funkciu čítania POSIX:



>>ssize_t pread(intslonovinová kosť,prázdny *bufet,veľkosť_tnbyte, off_t offset);
>>ssize_t prečítané(intfd,prázdny *bufet,veľkosť_tnbytov);

Z volania metódy čítania je možné vziať tri argumenty parametrov:



int fd: Deskriptor súboru súboru, z ktorého sa majú informácie čítať. Buď môžeme použiť deskriptor súboru získaný otvoreným systémovým volaním, alebo môžeme použiť 0, 1 alebo 2 odkazujúce na typický vstup, pravidelný výstup alebo pravidelnú chybu.





Prázdne *bufet: Vyrovnávacia pamäť alebo pole znakov, v ktorom by mali byť uložené údaje uchovávané a uchovávané.

Veľkosť_t nbyte: Počet bajtov, ktoré bolo potrebné prečítať z dokumentu pred skrátením. Všetky informácie môžu byť uložené do vyrovnávacej pamäte, ak sú informácie na čítanie kratšie ako nbytov.



Popis

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

Pri dokumentoch, ktoré umožňujú čítanie, sa proces čítania začína posunom dokumentu a posun sa zvýši o počet prečítaných bajtov. Ak je posun dokumentu na okraji súboru alebo za ním, nie sú prečítané žiadne bajty a príkaz read () žiadny.

Keď je počet 0, funkcia read () rozpozná nižšie uvedené chyby. Ak nie sú žiadne chyby alebo ak sa read () neúčtuje s chybami, read () prinesie nulu s počtom 0, a preto nemá žiadne ďalšie dôsledky.

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

Návratová hodnota

Číslica bajtov „prečítaných“ a „predbežných“ vrátených po dosiahnutí cieľa musí byť nezáporné celé číslo, pričom nula ukazuje na koniec súboru. Pozícia dokumentu je posunutá o toto číslo, alebo inak, na označenie chyby, metódy vrátia -1 a priradia 'errno'. Ak je tento údaj menší ako požadovaný počet bajtov, nejedná sa o chybový bajt. Je možné, že zatiaľ je k dispozícii menej bytov.

Chyby

Funkcia predbežného čítania a čítania bude neúspešná, ak sa vyskytnú tieto chyby:

ZASE:

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

EWOULDBLOCK:

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

EBADF:

Písmeno „fd“ nemusí byť použiteľným deskriptorom alebo nemusí byť otvorené na čítanie.

VÝCHOZÍ:

K tomu dôjde, keď sa váš „buf“ nachádza mimo váš dostupný adresný priestor.

EINTR:

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

VÝBER:

K tejto chybe dochádza, keď je váš deskriptor 'fd' zapojený do objektu, ktorý nie je vhodný na čítanie, alebo bol dokument rozviazaný s príznakom O_DIRECT a s jednou alebo druhou adresou uvedenou v 'buf', hodnotou uvedenou v 'count “alebo posun dokumentu nie je vhodne priradený.

VÝBER:

Deskriptor „fd“ mohol byť vytvorený pomocou volania na timerfd_create (2) a na čítanie bol daný vyrovnávací pamäť nesprávnej veľkosti.

EIO:

Je to chyba vstupu/výstupu. K tomu dochádza vtedy, 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 sa jej skupina procesov ponechá. Ďalším dôvodom tejto chyby môže byť chyba vstupu/výstupu nízkej úrovne pri čítaní z pevného disku alebo pásky. Ďalšou potenciálnou príčinou EIO v sieťových dátových súboroch je odstránenie poradného zamykania v deskriptore súborov a zlyhanie tohto zámku.

EISDIR:

Popisovač súboru „fd“ patrí do adresára.

Poznámky:

Môže sa tiež vyskytnúť mnoho ďalších chýb, ktoré závisia 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é v POSIX.1. V systéme Linux je možné prenášať maximálne 0x7ffff000 (2 147 479 552) bajtov funkciou čí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). Pri súborových systémoch NFS platí, že iba v prvom okamihu, keď sa časová pečiatka zmení prečítaním malých tokov informácií, ďalšie hovory to neurobia. Je vyvolané ukladaním do vyrovnávacej pamäte atribútov na strane klienta, 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 vyrovnávacej pamäte klienta nespúšťajú zmeny v štandarde atime na serveri, pretože nie sú k dispozícii žiadne údaje na strane servera. Odstránením vyrovnávacej pamäte atribútov na strane klienta bude možné získať prístup k metadátam systému UNIX, čo by však vo väčšine prípadov výrazne zvýšilo zaťaženie servera a 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 tak, ako je v novom súbore. Pridajte knižnice a v hlavnej funkcii inicializujte deskriptor a veľkosť. Deskriptor otvára súbor a veľkosť sa používa na čítanie údajov súboru.

Výstup pre vyššie uvedený kód by bol taký, ako je znázornené na obrázku nižšie.

Príklad 02:

Ďalej je uvedený ďalší príklad na ilustráciu fungovania funkcie čítania.

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

Záver

Účinne sme čítali funkciu čítania POSIX v programovaní C. Našťastie už nie sú žiadne pochybnosti.