C programavimas

POSIX skaitymo funkcija C programavime

POSIX skaitymo funkcija C programavime
Tradicinėse su POSIX suderinamose operacinėse sistemose, norėdama gauti informacijos iš failų sistemoje esančio dokumento, programa naudojo perskaitytą sistemos iškvietimą. Dokumento aprašas, prie kurio paprastai galima prisijungti iš ankstesnio kvietimo atidaryti, apibrėžiamas faile. Šis perskaitytas sistemos skambutis nuskaito informaciją baitais ir sveiką skaičių, kurį skambintojas nurodo iš dokumento, ir tada išsaugo jį buferyje, kurį teikia skambinimo mechanizmas.

Funkcijos apibrėžimas

Prieš apibrėždami skaitymo funkciją savo kode, turite įtraukti keletą būtinų paketų.

# įtraukti

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

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

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

int fd: Failo, iš kurio reikia skaityti informaciją, bylos aprašas. Mes galime naudoti failo deskriptorių, gautą per atvirą sistemos skambutį, arba galime tiesiog naudoti 0, 1 arba 2, nurodydami atitinkamai tipišką įvestį, įprastą išvestį arba įprastą klaidą.

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

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

apibūdinimas

Metodas „read ()“ bando nuskaityti „nbyte“ baitus į buferio talpyklą, nurodytą „buf“, iš failo, susieto su atviro dokumento deskriptoriumi „Fildes“ arba „fd“. Jis neapibrėžia kelių tuo pačiu srautu, FIFO ar terminalo įrenginiu vienu metu atliekamų skaitymų pobūdžio.

Dokumentuose, kurie leidžia 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ų, nėra skaitytų baitų, o perskaitytas () neduoda.

Kai skaičius yra 0, skaitydami () atpažinsite toliau paminėtas klaidas. Jei klaidų nėra arba jei skaitymas () nėra apskaitytas naudojant klaidas, skaitymo () rezultatas yra nulis, kai skaičius 0, todėl neturi jokių kitų pasekmių.

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

Grąžinimo vertė

Baitų „perskaitytas“ ir „pread“ skaičius, grąžintas pasiekus, turi būti ne neigiamas sveikasis skaičius, o nulis taškų iki failo pabaigos. Dokumento pozicija eina šiuo skaičiumi, kitaip nurodant klaidą, metodai grąžina -1 ir priskiria „errno“. Kai šis skaičius yra mažesnis nei reikalaujamas baitų skaičius, tai nėra klaidos baitas. Gali būti, kad kol kas yra mažiau baitų.

Klaidos

Klaidos ir skaitymo funkcija bus nesėkminga, jei atsiras šių klaidų:

EAGAIN:

Dokumentas ar failo aprašas „fd“ priklauso ne lizdo failui, kuris buvo pažymėtas kaip neužblokuojantis (O NONBLOCK) ir blokuos skaitymą.

UŽTIKRINIMAS:

Deskriptorius „fd“ priklauso lizdui, kuris buvo pažymėtas kaip neužblokuojantis (O_NONBLOCK) ir blokuos skaitymą.

EBADF:

„Fd“ negali būti naudojamas deskriptorius arba jis negali būti atviras skaitymui.

EFAULT:

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

EINTR:

Prieš nuskaitant informacinius duomenis, skambutis galėjo nutrūkti signalu.

EINVAL:

Ši klaida įvyksta, kai „fd“ deskriptorius yra įtrauktas į objektą, kuris nėra tinkamas skaityti, arba kai dokumentas buvo atrištas naudojant „O_DIRECT“ vėliavą, o vienas ar kitas adresas nurodytas „buf“, reikšmė nurodyta „count“ ", arba dokumento kompensavimas nėra tinkamai susietas.

EINVAL:

Apibūdinimas „fd“ galėjo būti suformuotas naudojant kvietimą timerfd_create (2), o neteisingo dydžio buferis buvo duotas skaityti.

EIO:

Tai įvesties / išvesties klaida. Tai atsitinka, kai foninių procesų grupė bando skaityti iš savo reguliavimo terminalo, o viena ar kita nepastebi arba blokuoja SIGTTIN, arba jos procesų grupė yra netekusi. Kita šios klaidos priežastis gali būti žemo lygio įvesties / išvesties klaida skaitant iš kietojo disko ar juostos. Kita galima ETO priežastis, susijusi su duomenų tinklų failais, yra patariamojo failo deskriptoriaus užrakinimo pašalinimas ir šio užrakto gedimas.

EISDIR:

Failų aprašas „fd“ priklauso katalogui.

Pastabos:

Taip pat gali atsirasti daugybė kitų klaidų, priklausančių nuo objekto, susieto su deskriptoriumi „fd“. Tiek size_t, tiek ssize_t formos yra nepažymėtos ir pažymėtos skaitmeninių duomenų tipais, apibrėžtais POSIX.1. „Linux“ sistemoje, skaitant funkciją (ir lygiaverčius sistemos iškvietimus), gali būti perduodami ne daugiau kaip 0x7ffff000 (2 147 479 552) baitai, grąžinant iš pradžių perduotų baitų skaičių (tiek 32, tiek 64 bitų platformose). Naudojant NFS failų sistemas, tik pirmą akimirką laiko žymė pakeičiama skaitant mažus informacijos srautus, paskesni skambučiai to nepadarys. Tai sukelia kliento atributų talpykla, nes, nors ir ne visi, NFS klientai nutraukia atnaujinimą į serverį per st_atime (paskutinis failo prieigos laikas), o kliento skaitymai, įvykdyti iš kliento buferio, nesukels st atime serveryje, nes nėra serverio 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 yra naujame faile. Pridėkite bibliotekų ir pagrindinėje funkcijoje pradėkite aprašą ir dydį. Deskriptorius atidaro failą, o dydis naudojamas failo duomenims nuskaityti.

Aukščiau esančio kodo išvestis bus tokia, kaip parodyta žemiau esančiame paveikslėlyje.

02 pavyzdys:

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

Sukurkite kitą failą ir užrašykite žemiau esantį kodą. Čia yra du deskriptoriai, fd1 ir fd2, kurie abu turi savo atviros lentelės failų prieigą. Taigi foobarui.txt, kiekvienas deskriptorius turi savo failo vietą. Pats pirmas foobar baitas.txt yra išverstas iš fd2, o rezultatas yra c = f, o ne c = o.

Išvada

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

Naudingi įrankiai „Linux“ žaidėjams
Jei jums patinka žaisti žaidimus „Linux“ sistemoje, yra tikimybė, kad galbūt naudojote tokias programas ir įrankius kaip „Wine“, „Lutris“ ir „OBS Stud...
„HD Remastered“ žaidimai, skirti „Linux“, kurie niekada anksčiau nebuvo išleisti „Linux“
Daugelis žaidimų kūrėjų ir leidėjų siūlo senų žaidimų HD remasterį, kad prailgintų franšizės laiką. Prašome gerbėjų, prašančių suderinamumo su šiuolai...
Kaip naudoti „AutoKey“, norint automatizuoti „Linux“ žaidimus
„AutoKey“ yra darbalaukio automatizavimo įrankis, skirtas „Linux“ ir „X11“, užprogramuotas „Python 3“, „GTK“ ir „Qt“. Naudodami scenarijų ir „MACRO“ f...