POSIX lugemisfunktsioon C programmeerimisel

Posix Read Function C Programing

Traditsioonilistes POSIX -iga ühilduvates operatsioonisüsteemides kasutas programm failisüsteemis sisalduva dokumendi kohta teabe saamiseks lugemissüsteemi kõnet. Fail määratleb dokumendi kirjelduse, millele tavaliselt pääseb juurde eelmisest avamiskutsest. See lugemise süsteemikõne loeb baitides oleva teabe ja täisarvu, mille helistaja dokumendist määrab, ning salvestab selle seejärel helistamismehhanismi pakutud puhvrisse.

Funktsiooni määratlus

Enne koodi lugemisfunktsiooni määratlemist peate lisama mõned nõutavad paketid.



#kaasake

Siin saate POSIX -i lugemisfunktsiooni määratleda järgmiselt.



>>ssize_t pread(intelevandiluu,tühine *buf,suurus_tnbyte, off_t offset);
>>ssize_t loetud(intfd,tühine *buf,suurus_tnbaiti);

Lugemismeetodi kutsest saab võtta kolm parameetri argumenti:



int fd: Faili failikirjeldus, kust teavet tuleb lugeda. Võime kas kasutada avatud süsteemikõne kaudu saadud failikirjeldust või kasutada lihtsalt 0, 1 või 2, mis viitavad vastavalt tüüpilisele sisendile, tavalisele väljundile või tavalisele veale.

Tühine *buf: Puhver või märgimassiiv, millesse loetud andmed salvestada ja hoida.

Suurus_t nbaiti: Baitide arv, mis tuli enne kärpimist dokumendist välja lugeda. Kogu teavet saab puhvrisse salvestada, kui loetav teave on lühem kui nbait.



Kirjeldus

Meetod read () proovib lugeda „nbyte” baite puhver vahemällu, millele viitab „buf”, kas avatud dokumendikirjeldusega „Fildes” või „fd” ühendatud failist. See ei määratle sama voo, FIFO või terminaliseadme mitme samaaegse lugemise olemust.

Lugemist võimaldavate dokumentide puhul algab lugemisprotsess dokumendi nihkega ja nihet suurendatakse loetud baitide arvu võrra. Kui dokumendi nihe on faili servas või sellest väljaspool, ei loeta baite ja read () ei anna ühtegi.

Kui arv on 0, tunneb lugemine () ära allpool nimetatud vead. Kui vigu pole või kui loendit () ei arvestata veaga, annab lugemine () nulliga, mille arv on 0, ja sellel ei ole seetõttu muid tagajärgi.

Kui arv on POSIX.1 kohaselt suurem kui SSIZE_MAX, määrab tulemuse rakendus.

Tagasiväärtus

Saavutamisel taastatud baitide „loetud” ja „valmis” arv peab olema negatiivne täisarv, null aga faili lõppu. Dokumendi asukohta edendatakse selle numbri võrra või muidu vea tähistamiseks tagastavad meetodid -1 ja määravad „errno”. Kui see arv on väiksem kui taotletud baitide arv, ei ole see eksitav bait. Võimalik, et praegu on saadaval vähem baite.

Vead

Eeltellimise ja lugemise funktsioon ebaõnnestub, kui ilmnevad järgmised vead:

EAGAIN:

Dokumendi või faili kirjeldus „fd” kuulub mittepistikfaile, mis on märgistatud mitteblokeerivaks (O NONBLOCK) ja blokeerib lugemise.

EWOULDBLOCK:

Kirjeldus „fd” kuulub pistikupessa, mis on märgistatud mitteblokeerivaks (O_NONBLOCK) ja blokeerib lugemise.

EBADF:

„Fd” ei pruugi olla kasutatav kirjeldus või ei pruugi see lugemiseks avatud olla.

EFAULT:

See juhtub siis, kui teie buf asub väljaspool teie juurdepääsetavat aadressiruumi.

EINTR:

Enne teabeandmete lugemist võis kõne signaali tõttu katkeda.

VALIK:

See tõrge ilmneb siis, kui teie fd -deskriptor on seotud objektiga, mis ei sobi lugemiseks, või kui dokument on lahti seotud lipuga O_DIRECT ja üks või teine ​​aadress, mis on märgitud lahtris buf, väärtus on arv 'või pole dokumendi nihe asjakohaselt seotud.

VALIK:

Kirjeldus „fd” võis olla moodustatud timerfd_create (2) kutset kasutades ja lugemiseks on antud vale suurusega puhver.

EIO:

See on sisend/väljund viga. See juhtub siis, kui taustprotsessirühm üritab oma regulatiivterminalilt lugeda ja üks või teine ​​jätab SIGTTIN -i tähelepanuta või blokeerib selle või kui selle protsessirühm jääb ilma. Selle vea teine ​​põhjus võib olla madala taseme sisend-/väljundviga kõvakettalt või lindilt lugemise ajal. Teine potentsiaalne Euroopa uurimismääruse põhjus võrguga ühendatud andmefailides on failikirjelduse nõustava lukustuse eemaldamine ja selle luku rike.

EISDIR:

Failikirjeldus „fd” kuulub kataloogi.

Märkused:

Võib esineda ka palju muid vigu, mis sõltuvad deskriptoriga „fd” lingitud objektist. Mõlemad vormid size_t ja ssize_t on märgistamata ja tähistatud numbriliste andmetüüpidega, mis on määratletud POSIX.1 abil. Linuxis saab lugemisfunktsiooni (ja samaväärsete süsteemikõnede) kaudu edastada maksimaalselt 0x7ffff000 (2 147 479 552) baiti, tagastades algselt edastatud baitide arvu (nii 32- kui ka 64-bitistel platvormidel). NFS -failisüsteemide puhul muudetakse ajatempli muutmise esimesel hetkel väikseid infovooge lugedes, järgnevad kõned seda ei tee. Selle käivitab kliendipoolsete atribuutide vahemällu salvestamine, sest kuigi mitte kõik, lõpetavad NFS-i kliendid serveri värskendamise st_atime (viimane failide juurdepääsuaeg) kaudu ja kliendipoolsed lugemised, mis on täidetud kliendi puhvrist, ei käivita muudatusi serveris, kuna serveripoolseid näitu pole saadaval. Eemaldades kliendipoolse atribuutide vahemälu, pääseb juurde UNIXi metaandmetele, kuid see suurendaks oluliselt serveri koormust ja mõjutaks enamikul juhtudel tootlikkust.

Näide 01:

Siin on C -programm lugemisfunktsiooni kõne demonstreerimiseks Linuxi süsteemis. Kirjutage allolev käsk uues failis. Lisage teegid ja lähtestage põhifunktsioonis deskriptor ja suurus. Kirjeldus avab faili ja faili andmete lugemiseks kasutatakse suurust.

Ülaltoodud koodi väljund oleks selline, nagu on näidatud alloleval pildil.

Näide 02:

Järgmine näide lugemisfunktsiooni illustreerimiseks on toodud allpool.

Looge teine ​​fail ja kirjutage allpool olev kood üles nii, nagu see on. Siin on kaks kirjeldust, fd1 ja fd2, millel mõlemal on juurdepääs avatud tabeli failidele. Nii et faili foobar.txt puhul on igal deskriptoril oma faili asukoht. Foobar.txt esimene bait on tõlgitud fd2 -st ja tulemuseks on c = f, mitte c = o.

Järeldus

Oleme C -programmeerimisel lugenud tõhusalt POSIX -lugemisfunktsiooni. Loodetavasti pole kahtlusi jäänud.