POSIX skaitymo funkcija programuojant C

Posix Read Function C Programing



Tradicinėse su POSIX suderinamose operacinėse sistemose, norint gauti informacijos iš failų sistemoje esančio dokumento, programa naudojo skaitymo sistemos skambutį. Dokumento aprašas, kuris paprastai pasiekiamas iš ankstesnio skambučio atidaryti, yra apibrėžtas faile. Šis skaitymo sistemos iškvietimas nuskaito informaciją baitais ir sveikąjį skaičių, kurį skambinantysis nurodo iš dokumento, ir išsaugo ją iškvietimo mechanizmo pateiktame buferyje.

Funkcijos apibrėžimas

Prieš nustatydami skaitymo funkciją savo kode, turite įtraukti keletą būtinų paketų.







#įtraukti

Štai kaip apibrėžiate POSIX skaitymo funkciją:



>>„ssize_t“(tarptdramblio kaulo,tuštuma *buf,dydis_tnbaitas, off_t poslinkis);
>>ssize_t skaityti(tarptfd,tuštuma *buf,dydis_tnbaitų);

Iš skaitymo metodo iškvietimo galima paimti tris parametrų argumentus:



int fd: Failo, iš kurio reikia skaityti informaciją, aprašas. Galime naudoti failo aprašą, gautą per atviros sistemos skambutį, arba tiesiog naudoti 0, 1 arba 2, atitinkamai nurodant tipinę įvestį, įprastą išvestį arba įprastą klaidą.





Tuščia *buf: Buferis arba simbolių masyvas, kuriame turėtų būti išsaugoti ir saugomi skaityti duomenys.

Dydis_t nbaitas: Baitų, kuriuos reikėjo perskaityti iš dokumento prieš sutrumpinant, skaičius. Visa informacija gali būti saugoma buferyje, jei skaitoma informacija yra trumpesnė nei nbaitai.



apibūdinimas

Skaitymo () metodas bando nuskaityti „nbyte“ baitus į buferio talpyklą, kurią nurodo „buf“, iš failo, susijusio su atviru dokumentų aprašymu „Fildes“ arba „fd“. Jis neapibrėžia kelių vienu metu atliekamų to paties srauto, FIFO ar galinio įrenginio skaitymų pobūdžio.

Dokumentuose, kuriuos galima skaityti, skaitymo procesas prasideda nuo dokumento poslinkio, o poslinkis padidinamas perskaitytų baitų skaičiumi. Jei dokumento poslinkis yra failo krašte arba už jo ribų, baitai neskaitomi, o skaitymas () neduoda.

Kai skaičius yra 0, skaitymas () atpažins toliau nurodytas klaidas. Jei nėra klaidų arba jei skaitymas () nėra įtrauktas į klaidas, skaitymas () duoda nulį, skaičiuojant 0, ir todėl neturi kitų padarinių.

Jei skaičius yra didesnis nei SSIZE_MAX, kaip nurodyta POSIX.1, tada rezultatą lemia įgyvendinimas.

Grąžinti vertę

Baitų „perskaitytas“ ir „iš anksto paruoštas“ skaičius, pasiektas pasiekus, turi būti neneigiamas sveikasis skaičius, o nulis-iki failo pabaigos. Dokumento padėtis padidinama šiuo skaičiumi arba, norint parodyti klaidą, metodai grąžina -1 ir priskiria „klaidą“. Kai šis skaičius yra mažesnis už prašomą baitų skaičių, tai nėra baito klaida. Gali būti, kad kol kas yra mažiau baitų.

Klaidos

Pasirengimo ir skaitymo funkcija bus nesėkminga, jei įvyks šios klaidos:

EAGAIN:

Dokumentas arba failo aprašas „fd“ priklauso ne lizdiniam failui, kuris buvo pažymėtas kaip neblokuojantis (O NONBLOCK) ir užblokuos skaitymą.

EWOULDBLOCK:

Aprašas „fd“ priklauso lizdui, kuris buvo pažymėtas kaip neužblokuojantis (O_NONBLOCK) ir užblokuos rodmenis.

EBADF:

„Fd“ gali būti netinkamas deskriptorius arba jis negali būti atidarytas skaitymui.

„EFAULT“:

Taip atsitinka, kai jūsų „buf“ yra už pasiekiamo adreso srities.

EINTR:

Prieš skaitant informacijos duomenis, skambutis galėjo nutrūkti dėl signalo.

PASIRINKIMAS:

Ši klaida įvyksta, kai jūsų „fd“ deskriptorius yra įtrauktas į objektą, kuris netinka skaitymui, arba dokumentas buvo atsietas su O_DIRECT vėliava ir vienas ar kitas adresas, nurodytas „buf“, reikšmė nurodyta „count“ “, arba dokumento poslinkis nėra tinkamai susietas.

PASIRINKIMAS:

Aprašas „fd“ galėjo būti suformuotas naudojant iškvietimą timerfd_create (2), o skaityti buvo pateiktas netinkamo dydžio buferis.

EIO:

Tai įvesties/išvesties klaida. Tai atsitinka, kai fono proceso grupė bando skaityti iš savo reguliavimo terminalo, o vienas ar kitas nepastebi arba blokuoja SIGTTIN, arba jos proceso grupė netenka. Kita šios klaidos priežastis gali būti žemo lygio įvesties/išvesties klaida, tuo tarpu skaitant iš kietojo disko ar juostos. Kita potenciali ETO priežastis tinklo duomenų rinkmenose yra patarimo užrakinti failų aprašą pašalinimas ir to užrakto gedimas.

EISDIR:

Failų aprašas „fd“ priklauso katalogui.

Pastabos:

Taip pat gali atsirasti daug kitų klaidų, kurios priklauso nuo objekto, susieto su deskriptoriumi „fd“. Formos size_t ir ssize_t yra nepažymėtos ir pažymėtos skaitmeninių duomenų rūšys, apibrėžtos POSIX.1. „Linux“ sistemoje daugiausiai 0x7ffff000 (2 147 479 552) baitų galima perduoti skaitymo funkcija (ir lygiaverčiais sistemos iškvietimais), grąžinant iš pradžių perduotų baitų skaičių (tiek 32 bitų, tiek 64 bitų platformose). Naudojant NFS failų sistemas, tik pirmą akimirką pakeitus laiko žymę, skaitant mažus informacijos srautus, vėlesni skambučiai to nepadarytų. Tai suaktyvina kliento atributų talpykla, nes, nors ir ne visi, NFS klientai nutraukia atnaujinimą į serverį per st_atime (paskutinį failo prieigos laiką), o kliento pusės skaitymai, įvykdyti iš kliento buferio, nesukels st. serveryje, nes nėra serverio pusės rodmenų. Pašalinus kliento atributų talpyklą, galima pasiekti UNIX metaduomenis, tačiau tai žymiai padidintų serverio apkrovą ir daugeliu atvejų paveiktų produktyvumą.

01 pavyzdys:

Čia yra C programa, skirta parodyti skaitymo funkcijos iškvietimą „Linux“ sistemoje. Parašykite žemiau esančią komandą taip, kaip ji yra naujame faile. Pridėkite bibliotekų ir pagrindinėje funkcijoje inicijuokite aprašą ir dydį. Aprašas atidaro failą, o dydis naudojamas failo duomenims skaityti.

Aukščiau pateikto kodo išvestis būtų tokia, kaip parodyta žemiau esančiame paveikslėlyje.

02 pavyzdys:

Kitas pavyzdys, iliustruojantis skaitymo funkcijos veikimą, pateiktas žemiau.

Sukurkite kitą failą ir užsirašykite žemiau esantį kodą. Čia yra du aprašai: fd1 ir fd2, kurie abu turi savo prieigą prie atviro stalo failų. Taigi, naudojant „foobar.txt“, kiekvienas aprašas turi savo failo vietą. Pats pirmasis foobar.txt baitas yra išverstas iš fd2, o rezultatas yra c = f, o ne c = o.

Išvada

Mes efektyviai perskaitėme POSIX skaitymo funkciją C programavime. Tikimės, kad abejonių neliko.