C Programiranje

Funkcija branja POSIX v programiranju C

Funkcija branja POSIX v programiranju C
V tradicionalnih operacijskih sistemih, združljivih s POSIX, je program za branje informacij iz dokumenta, ki je v datotečnem sistemu, uporabljal sistemski klic za branje. Datoteka definira deskriptor dokumenta, do katerega običajno dostopate iz predhodnega klica za odpiranje. Ta sistemski klic prebere podatke v bajtih in celo število, ki jih kličoči določi iz dokumenta, nato pa jih shrani v medpomnilnik, ki ga zagotavlja klicni mehanizem.

Opredelitev funkcije

Preden v svoji kodi definirate funkcijo branja, morate vključiti nekaj zahtevanih paketov.

#include

Tukaj je opisano, kako definirate funkcijo branja POSIX:

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

Iz klica metode branja lahko vzamemo tri argumente parametrov:

int fd: Deskriptor datoteke, od koder bodo informacije prebrane. Lahko uporabljamo deskriptor datoteke, pridobljen z odprtim sistemskim klicem, ali pa uporabimo 0, 1 ali 2, ki se nanaša na tipičen vhod, običajni izhod ali navadno napako.

Praznina * buf: Medpomnilnik ali matrična matrika, v katero je treba shraniti in hraniti prebrane podatke.

Velikost_t nbyte: Število bajtov, ki jih je bilo treba prebrati iz dokumenta pred skrajšanjem. Vse podatke je mogoče shraniti v medpomnilnik, če so informacije, ki jih je treba prebrati, krajše od nbajtov.

Opis

Metoda read () poskuša prebrati bajte 'nbyte' v predpomnilnik medpomnilnika, na katerega se sklicuje 'buf', bodisi iz datoteke, povezane z deskriptorjem odprtega dokumenta 'Fildes' ali 'fd'. Ne določa narave več hkratnih branja v istem toku, FIFO ali terminalni enoti.

Pri dokumentih, ki omogočajo branje, se postopek branja začne z odmikom dokumenta, odmik pa se poveča za število prebranih bajtov. Če je odmik dokumenta na robu datoteke ali zunaj nje, ni prebranih bajtov in branje () ne da nobenega.

Ko je štetje 0, bo branje () prepoznalo spodaj navedene napake. Če ni napak ali če branje () ni upoštevano pri Napakah, branje () da nič s štetjem 0 in zato nima drugih posledic.

Če je število večje od SSIZE_MAX, kot na POSIX.1, potem je rezultat določen z izvedbo.

Vrnjena vrednost

Številka bajtov 'read' in 'pread', povrnjena ob dosežku, mora biti celo negativno celo število, nič pa kaže na konec datoteke. Položaj dokumenta se premakne s to številko, sicer pa pomeni napako, metode vrnejo -1 in dodelijo 'errno'. Če je ta številka manjša od števila zahtevanih bajtov, to ni bajt z napako. Zaenkrat je na voljo manj bajtov.

Napake

Funkcija vnaprejšnjega branja in branja bo neuspešna, če pride do teh napak:

EAGAIN:

Deskriptor dokumenta ali datoteke 'fd' pripada datoteki brez vtičnice, ki je bila označena kot neblokirajoča (O NONBLOCK) in bo blokirala branje.

EWOULDBLOCK:

Deskriptor 'fd' pripada vtičnici, ki je bila označena kot neblokirajoča (O_NONBLOCK) in bo blokiral branje.

EBADF:

'Fd' morda ni uporaben deskriptor ali pa ni na voljo za branje.

NAPOR:

To se zgodi, ko je vaš 'buf' zunaj vašega dosegljivega naslovnega prostora.

EINTR:

Pred branjem informacijskih podatkov je morda klic prekinil signal.

EINVAL:

Ta napaka se pojavi, ko je vaš deskriptor 'fd' vpleten v objekt, ki ni primeren za branje, ali pa je bil dokument odvezan z zastavico O_DIRECT in je en ali drug naslov naveden v 'buf', vrednost pa navedena v 'count ', ali odmik dokumenta ni ustrezno povezan.

EINVAL:

Deskriptor 'fd' je bil morda oblikovan s klicem timerfd_create (2), nepravilen velikost medpomnilnika pa je bila dana v branje.

EIO:

Gre za vhodno / izhodno napako. To se zgodi, ko poskuša skupina v ozadju brati s svojega regulativnega terminala in ena ali druga spregleda ali blokira SIGTTIN ali pa njena procesna skupina izgubi življenje. Drug razlog za to napako je lahko nizko nivojska vhodno / izhodna napaka med branjem s trdega diska ali traku. Drug potencialni vzrok EIO za omrežne podatkovne datoteke je odstranitev svetovalnega zaklepanja na deskriptorju datotek in okvara te zaklepanja.

EISDIR:

Deskriptor datoteke 'fd' pripada imeniku.

Opombe:

Lahko se zgodi tudi veliko drugih napak, odvisno od predmeta, povezanega z deskriptorjem „fd“. Obrazca size_t in ssize_t sta neoznačena in označena s številčnimi podatkovnimi vrstami, ki jih definira POSIX.1. V Linuxu je mogoče s funkcijo branja (in enakovrednimi sistemskimi klici) poslati največ 0x7ffff000 (2.147.479.552) bajtov in vrniti število prvotno poslanih bajtov (na 32-bitni in 64-bitni platformi). Z datotečnimi sistemi NFS se le prvi trenutek časovnega žiga spremeni z branjem drobnih tokov informacij, poznejši klici tega ne bi storili. Sproži ga predpomnjenje atributov na strani odjemalca, ker odjemalci NFS, čeprav ne vsi, prenehajo s posodabljanjem na strežnik prek st_atime (zadnji čas dostopa do datoteke) in odjemalska branja, izpolnjena iz vmesnega pomnilnika odjemalca, ne sprožijo sprememb atime na strežniku, saj odčitavanja na strani strežnika niso na voljo. Z odstranitvijo predpomnilnika atributov na strani odjemalca je mogoče dostopati do metapodatkov UNIX, vendar bi to v večini primerov znatno povečalo obremenitev strežnika in vplivalo na produktivnost.

Primer 01:

Tukaj je program C, ki prikazuje klic funkcije branja v sistemu Linux. Spodnji ukaz zapišite v novo datoteko. Dodajte knjižnice in v glavni funkciji inicializirajte deskriptor in velikost. Deskriptor odpre datoteko, velikost pa se uporablja za branje podatkov datoteke.

Izhod za zgornjo kodo bi bil tak, kot je prikazano na spodnji sliki.

Primer 02:

Naslednji primer je ponazoritev delovanja bralne funkcije.

Ustvarite drugo datoteko in si zapišite spodnjo kodo, kakršna je v njej. Tu sta dva deskriptorja, fd1 in fd2, ki imata oba svoj dostop do datoteke odprte tabele. Torej za foobar.txt, vsak deskriptor ima svojo lokacijo datoteke. Prvi bajt foobarja.txt je preveden iz fd2 in rezultat je c = f, ne c = o.

Zaključek

Funkcijo branja POSIX v programiranju C smo učinkovito prebrali. Upajmo, da dvomov ni več.

Kako zajeti in pretakati svojo igralno sejo v Linuxu
V preteklosti je bilo igranje iger le hobi, sčasoma pa je igralniška industrija zabeležila veliko rast glede tehnologije in števila igralcev. Občinstv...
Najboljše igre z ročnim sledenjem
Oculus Quest je pred kratkim predstavil odlično idejo ročnega sledenja brez krmilnikov. Z vedno večjim številom iger in dejavnosti, ki izvajajo podpor...
Kako prikazati prekrivanje zaslonskega menija v celozaslonskih aplikacijah in igrah za Linux
Igranje celozaslonskih iger ali uporaba aplikacij v celozaslonskem načinu brez motenj vam lahko odreže ustrezne sistemske informacije, ki so vidne na ...