C Programmeerimine

POSIXi lugemisfunktsioon C-programmeerimises

POSIXi lugemisfunktsioon C-programmeerimises
Traditsioonilistes POSIXiga ühilduvates operatsioonisüsteemides kasutas programm failisüsteemis sisalduva dokumendi kohta teabe saamiseks süsteemi loetud kõnet. Dokumendi kirjeldaja, millele pääseb tavaliselt juurde eelmisest avamiskutsest, on fail määratletud. See loetud süsteemikõne loeb ette baitides sisalduva teabe ja täisarvu, mille helistaja dokumendist määrab, ja salvestab seejärel helistamismehhanismi pakutavasse puhvrisse.

Funktsiooni määratlus

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

# kaasata

Funktsiooni POSIX lugemisfunktsioon määratakse järgmiselt

>> ssize_t pread (int failid, void * buf, size_t nbyte, off_t nihe);
>> ssize_t lugeda (int fd, void * buf, size_t nbaiti);

Lugemismeetodi kutsest saab võtta kolm parameetri argumenti:

int fd: Faili kirjeldaja failist, kust teavet tuleb lugeda. Võime kasutada kas avatud süsteemikõne kaudu omandatud failikirjeldust või kasutada lihtsalt 0, 1 või 2 vastavalt tavalisele sisendile, tavalisele väljundile või tavalisele veale.

Tühine * buf: Puhver või tähemassiiv, kuhu loetud andmed tuleks salvestada ja hoida.

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

Kirjeldus

Meetod read () proovib lugeda "nbyte" baiti puhvermällu, millele viitab "buf", kas failist, mis on ühendatud avatud dokumendi deskriptoriga "Fildes" või "fd". See ei määratle mitme voo, FIFO või terminali mitme samaaegse lugemise olemust.

Lugemist võimaldavatel dokumentidel algab lugemisprotsess dokumendi nihkega ja nihet suurendatakse loetud baitide arvu võrra. Kui dokumendi nihe on faili servas või väljaspool, pole loetud baidid ja read () ei anna ühtegi.

Kui arv on 0, tunneb read () ära allpool nimetatud vead. Kui vigu pole või kui read () pole arvestatud vigade abil, annab read () nulli loendiga 0 ja seetõttu pole tal muid tagajärgi.

Kui arv on suurem kui SSIZE_MAX, vastavalt POSIX-ile.1, siis määrab tulemuse rakendamine.

Tagastusväärtus

Saavutamisel tagastatud baitide „loetud” ja „pread” arv peab olema mitte-negatiivne täisarv, samal ajal kui faili lõppu viitab null. Dokumendi asukohta liigutatakse selle numbri võrra, vea tähistamiseks tagastavad meetodid -1 ja määravad 'errno'. Kui see arv on väiksem kui taotletud baitide arv, pole see viga. Võib olla, et praegu on saadaval vähem baite.

Vead

Pread ja read funktsioon ei õnnestu, kui ilmnevad need vead:

EAGAIN:

Dokumendi või faili kirjeldaja „fd” kuulub mitte-sokli faili, mis on märgistatud blokeerimata (O NONBLOCK) ja blokeerib lugemise.

KÕLBLIKKUS:

Kirjeldaja 'fd' kuulub soklisse, mis on märgistatud blokeerimata (O_NONBLOCK) ja blokeerib lugemise.

EBADF:

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

EFAULT:

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

EINTR:

Enne teabeandmete lugemist võib kõne signaali järgi katkeda.

EINVAL:

See tõrge ilmneb siis, kui teie 'fd' deskriptor on seotud objektiga, mis pole lugemiseks sobiv, või kui dokument vabastati lipuga O_DIRECT ja üks või teine ​​aadress, mis on märgitud väärtusega 'buf', väärtus, mis on märgitud loendis "või dokumendi nihe pole asjakohaselt seotud.

EINVAL:

Kirjeldaja 'fd' võis olla moodustatud kutsega timerfd_create (2) ja lugemiseks on antud vale suurusega puhver.

EIO:

See on sisendi / väljundi viga. See juhtub siis, kui taustprotsesside rühm proovib oma regulatiivsest terminalist lugeda ja üks või teine ​​jätab SIGTTINi vaatamata või blokeerib seda või kui selle protsessigrupp on kaotatud. Selle vea teine ​​põhjus võib olla madala sisendi / väljundi viga, kui loete kõvakettalt või lindilt. Teine võrguühendusega andmefailide EIO potentsiaalne põhjus on failikirjelduse nõuandva lukustuse eemaldamine ja selle luku tõrge.

EISDIR:

Faili kirjeldaja 'fd' kuulub kataloogi.

Märkused:

Samuti võib ilmneda palju muid vigu, mis sõltuvad objektist, mis on seotud deskriptoriga „fd”. Nii vormid size_t kui ka ssize_t on POSIX-i määratletud märgistamata ja tähistatud arvandmetüübid.1. Linuxis saab lugemisfunktsiooni (ja samaväärsete süsteemikõnede) abil edastada maksimaalselt 0x7ffff000 (2 147 479 552) baiti, tagastades algselt edastatud baitide arvu (nii 32- kui 64-bitistel platvormidel). NFS-failisüsteemide abil muudetakse pisiteabe voogude lugemise abil lihtsalt ajatemplit, järgnevad kõned ei teeks seda. Selle käivitab kliendipoolsete atribuutide vahemällu salvestamine, sest kuigi mitte kõik, lõpetasid NFS-i kliendid värskenduse serverisse st_atime (viimane faili juurdepääsuaeg) ja kliendi puhvrist täidetud kliendipoolsed lugemised ei käivitaks muudatusi st- serveris, kuna serveripoolsed näidud pole saadaval. Kliendipoolse atribuudivahemälu eemaldamisega võidakse juurde pääseda UNIX-i metaandmetele, kuid see suurendaks oluliselt serveri koormust ja mõjutaks enamikul juhtudel tootlikkust.

Näide 01:

Siin on C-programm, mis näitab Linuxi süsteemis lugemisfunktsiooni väljakutset. Kirjutage käsk allpool nii, nagu see on uues failis. Lisage teegid ja lähtestage põhifunktsioonis kirjeldaja ja suurus. Kirjeldaja 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 töö illustreerimiseks on toodud allpool.

Looge teine ​​fail ja kirjutage allpool olev kood sellisena üles. Siin on kaks kirjeldajat, fd1 ja fd2, millel mõlemal on oma avatud tabeli faili juurdepääs. Nii foobari jaoks.txt, igal kirjeldajal on oma faili asukoht. Fobariba esimene bait.txt tõlgitakse fd2-st ja tulemuseks on c = f, mitte c = o.

Järeldus

Oleme C-programmeerimisel tõhusalt lugenud POSIX-lugemisfunktsiooni. Loodetavasti pole enam kahtlusi.

Parimad Oculus App Lab mängud
Kui olete Oculuse peakomplekti omanik, peate olema teadlik külglaadimisest. Kõrvalaadimine on protsess, millega installitakse peakomplekti mitte-poesi...
10 parimat mängu, mida Ubuntu kaudu mängida
Windowsi platvorm on olnud üks mängude domineerivaid platvorme, kuna tohutu protsent mänge areneb täna Windowsi loomupäraseks toetamiseks. Kas keegi s...
5 parimat arkaadmängu Linuxile
Tänapäeval on arvutid tõsised mängimiseks kasutatavad masinad. Kui te ei saa uut rekordit, teate, mida ma mõtlen. Selles postituses saate teada mõnda ...