Funkcija branja POSIX v programiranju C

Posix Read Function C Programing



V tradicionalnih operacijskih sistemih, združljivih s POSIX, je program za pridobivanje informacij iz dokumenta v datotečnem sistemu uporabil prebrani sistemski klic. Deskriptor dokumenta, do katerega običajno dostopate iz prejšnjega klica za odpiranje, je definiran z datoteko. Ta bralni sistemski klic prebere informacije v bajtih in celo število, ki jih klicatelj določi iz dokumenta, nato pa jih shrani v medpomnilnik, ki ga zagotavlja klicni mehanizem.

Opredelitev funkcije

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







#vključi

Funkcijo branja POSIX definirate tako:



>>ssize_t pread(intslonovina,nično *buf,velikost_tnbyte, off_t offset);
>>ssize_t preberi(intfd,nično *buf,velikost_tnbajtov);

Iz klica metode branja lahko vzamete tri argumente parametrov:



int fd: Deskriptor datoteke, iz katere se berejo podatki. Lahko bi uporabili deskriptor datoteke, pridobljen z odprtim sistemskim klicem, ali pa bi uporabili 0, 1 ali 2, ki se nanašajo na tipičen vnos, redni izhod ali redno napako.





Void *buf: Medpomnilnik ali niz znakov, v katerem je treba shranjene in shranjene prebrane podatke.

Velikost_t nbyte: Število bajtov, ki jih je bilo treba pred obrezovanjem prebrati iz dokumenta. Vse informacije se lahko shranijo v medpomnilnik, če so informacije, ki jih je treba prebrati, krajše od nbajtov.



Opis

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

Pri dokumentih, ki omogočajo branje, se postopek branja začne pri odmiku dokumenta, zamik pa se poveča za število prebranih bajtov. Če je odmik dokumenta na robu datoteke ali zunaj nje, ni prebranih bajtov, funkcija read () pa ne prinese nič.

Ko je število 0, program read () prepozna spodnje napake. Če ni napak ali če read () ni upoštevan z napakami, read () prinese nič s štetjem 0 in zato nima drugih posledic.

Če je število višje od SSIZE_MAX v skladu s POSIX.1, potem rezultat določi izvedba.

Vrnjena vrednost

Številka bajtov 'preberi' in 'pread', obrnjeni ob dosegu, mora biti nenegativno celo število, medtem ko nič kaže na konec datoteke. Položaj dokumenta se premakne s to številko ali drugače, da označijo napako, metode vrnejo -1 in dodelijo 'errno'. Če je ta številka manjša od zahtevanega števila bajtov, to ni napaka. Možno je, da je zaenkrat na voljo manj bajtov.

Napake

Funkcija pread in read ne bo uspela, če pride do teh napak:

EAGAIN:

Deskriptor dokumenta ali datoteke „fd“ pripada datoteki brez vtičnice, ki je 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 blokirala branje.

EBADF:

'Fd' morda ni uporaben deskriptor ali pa ni odprt za branje.

NAPAKA:

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

EINTR:

Pred branjem podatkovnih podatkov je klic morda prekinil signal.

IZBOR:

Do te napake pride, ko je vaš deskriptor 'fd' vpleten v predmet, ki ni primeren za branje, ali pa je bil dokument nevezan z zastavo O_DIRECT, in en ali drugi naslov naveden v 'buf', vrednost, navedena v 'count ', ali odmik dokumenta ni ustrezno povezan.

IZBOR:

Deskriptor „fd“ je bil morda oblikovan s klicem na timerfd_create (2), vmesni pomnilnik nepravilne velikosti pa je bil dan v branje.

EIO:

Gre za vhodno/izhodno napako. Pojavi se, ko skupina procesnih ozadij poskuša prebrati s svojega regulacijskega terminala in ena ali druga spregleda ali blokira SIGTTIN, ali pa je njena procesna skupina izgubljena. Drug razlog za to napako je lahko napaka pri vhodu/izhodu na nizki ravni, medtem ko bere s trdega diska ali traku. Drug možen vzrok EIO v omrežnih podatkovnih datotekah je odstranitev svetovalnega zaklepanja deskriptorja datotek in okvara te ključavnice.

EISDIR:

Deskriptor datoteke 'fd' pripada imeniku.

Opombe:

Lahko se pojavijo tudi številne druge napake, odvisno od predmeta, povezanega z deskriptorjem 'fd'. Tako obrazca size_t kot ssize_t sta neoznačena in označena številska tipa podatkov, ki jih določa POSIX.1. V Linuxu je mogoče s funkcijo branja (in enakovrednih sistemskih klicev) prenesti največ 0x7ffff000 (2,147,479,552) bajtov in vrniti število prvotno poslanih bajtov (na 32-bitnih in 64-bitnih platformah). Pri datotečnih sistemih NFS se prvič, ko se časovni žig spremeni z branjem drobnih tokov informacij, to ne zgodi. Sproži se s predpomnjenjem atributov na strani odjemalca, saj odjemalci NFS, čeprav ne vsi, prenehajo posodabljati na strežnik prek st_atime (zadnji čas dostopa do datoteke) in odčitki na strani odjemalca, izpolnjeni iz medpomnilnika odjemalca, ne bi sprožili sprememb st- atime na strežniku, saj odčitki na strani strežnika niso na voljo. Z odstranitvijo predpomnjenja atributov na strani odjemalca je mogoče dostopati do metapodatkov UNIX, vendar bi to znatno povečalo obremenitev strežnika in v večini primerov vplivalo na produktivnost.

Primer 01:

Tu je program C za prikaz klica funkcije branja v sistemu Linux. Spodnji ukaz zapišite, kot je v novi datoteki. Dodajte knjižnice in v glavni funkciji inicializirajte deskriptor in velikost. Deskriptor odpira datoteko, velikost pa se uporablja za branje podatkov o datoteki.

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

Primer 02:

Spodaj je naveden še en primer za ponazoritev funkcije branja.

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

Zaključek

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