C Ohjelmointi

POSIX-lukutoiminto C-ohjelmoinnissa

POSIX-lukutoiminto C-ohjelmoinnissa
Perinteisissä POSIX-yhteensopivissa käyttöjärjestelmissä ohjelma käytti luetun järjestelmän kutsua saadakseen tietoja tiedostojärjestelmän sisältämästä asiakirjasta. Tiedosto määrittelee asiakirjakuvaajan, jota tavallisesti käytetään aikaisemmasta kutsusta avata. Tämä luettu järjestelmäpuhelu lukee tavuina olevat tiedot ja kokonaisluvun, jonka soittaja määrittelee asiakirjasta, ja tallentaa sen sitten kutsumekanismin tarjoamaan puskuriin.

Toiminnon määritelmä

Ennen kuin määrität lukutoiminnon koodissasi, sinun on sisällytettävä joitain vaadittuja paketteja.

#sisältää

Näin määrität POSIX-lukutoiminnon:

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

Kolme parametriargumenttia voidaan ottaa lukumenetelmän kutsusta:

int fd: Tiedoston kuvaus, josta tiedot luetaan. Voisimme joko käyttää tiedostokuvaajaa, joka on hankittu avoimen järjestelmäkutsun kautta, tai voisimme käyttää vain 0, 1 tai 2, jotka viittaavat tyypilliseen syötteeseen, säännölliseen tulostukseen tai säännölliseen virheeseen.

Void * buf: Puskuri tai merkistö, johon luetut tiedot tulisi tallentaa ja säilyttää.

Koko_t tavu: Tavujen määrä, jotka oli luettava asiakirjasta ennen katkaisua. Kaikki tiedot voidaan tallentaa puskuriin, jos luettava tieto on alle natavua.

Kuvaus

Read () -menetelmä yrittää lukea nbyte-tavut puskurivälimuistiin, johon buf viittaa, joko tiedostosta, joka on liitetty avoimeen asiakirjakuvaajaan Fildes tai fd. Se ei määritä useiden samanaikaisten lukujen luonnetta samalla virralla, FIFO: lla tai päätelaitteella.

Asiakirjoissa, jotka mahdollistavat lukemisen, lukuprosessi alkaa asiakirjan siirrosta, ja siirtoa lisätään luettujen tavujen lukumäärällä. Jos asiakirjan siirtymä on tiedoston reunalla tai sen ulkopuolella, luettuja tavuja ei ole, ja read () ei tuota yhtään.

Kun määrä on 0, luku () tunnistaa alla mainitut virheet. Jos virheitä ei ole tai jos lukua () ei oteta huomioon virheillä, luku () tuottaa nollan lukumäärällä 0, eikä sillä näin ollen ole muita vaikutuksia.

Jos määrä on suurempi kuin SSIZE_MAX, POSIX: n mukaan.1, sitten tulos määräytyy toteutuksen perusteella.

Palautusarvo

Saavutettaessa palautettujen tavujen 'luettu' ja 'pread' numeroiden on oltava ei-negatiivinen kokonaisluku, kun taas nolla pistettä tiedoston loppuun. Asiakirjan sijaintia edistetään tällä numerolla, tai muuten, virheen merkitsemiseksi, menetelmät palauttavat -1 ja antavat 'errno'. Kun tämä luku on pienempi kuin pyydetty tavujen määrä, se ei ole virhe -tavu. Saattaa olla mahdollista, että tällä hetkellä käytettävissä on vähemmän tavuja.

Virheet

Pread and read -toiminto ei onnistu, jos nämä virheet tapahtuvat:

EAGAIN:

Asiakirja tai tiedostokuvaaja 'fd' kuuluu ei-socket-tiedostoon, joka on merkitty estämättömäksi (O NONBLOCK) ja estää lukemisen.

VAROITUS:

Kuvaaja 'fd' kuuluu liitäntään, joka on merkitty estämättömäksi (O_NONBLOCK) ja estää lukemisen.

EBADF:

Fd ei välttämättä ole käyttökelpoinen kuvaaja tai se ei ole avoin lukemiseen.

EFAULT:

Näin tapahtuu, kun "buf" on tavoitettavissa olevan osoitealueen ulkopuolella.

EINTR:

Ennen tietodatan lukemista puhelu voi olla hajonnut signaalilla.

EINVAL:

Tämä virhe ilmenee, kun 'fd' -kuvaajasi liittyy objektiin, joka ei sovellu lukemiseen, tai jos asiakirja on vapautettu O_DIRECT-lipulla ja yksi tai toinen buf-kentässä ilmoitettu osoite, arvo, joka on ilmoitettu 'tai dokumentin siirtoa ei ole yhdistetty asianmukaisesti.

EINVAL:

Kuvaaja 'fd' on ehkä muodostettu kutsun avulla timerfd_create (2), ja väärän kokoinen puskuri on annettu luettavaksi.

EIO:

Se on tulo- / lähtövirhe. Se tapahtuu, kun taustaprosessiryhmä yrittää lukea säätöpäätteestään ja toinen tai toinen jättää SIGTTINin huomiotta tai estää tai sen prosessiryhmä on kadonnut. Toinen syy tähän virheeseen voi olla matalan tason syöttö- / lähtövirhe, kun luetaan kiintolevyltä tai nauhalta. Toinen mahdollinen syy EIO: lle verkkotiedostoissa on tiedostokuvaimen neuvontalukituksen poistaminen ja lukituksen epäonnistuminen.

EISDIR:

Tiedostonkuvaaja 'fd' kuuluu hakemistoon.

Huomautuksia:

Myös muita virheitä saattaa esiintyä, riippuen objektista, joka on linkitetty kuvaajaan 'fd'. Sekä size_t- että ssize_t-lomakkeet ovat merkitsemättömiä ja merkittyjä numeerisia tietotyyppejä, jotka POSIX määrittelee.1. Linuxissa enintään 0x7ffff000 (2 147 479 552) tavua voidaan lähettää lukutoiminnolla (ja vastaavilla järjestelmäkutsuilla) palauttaen alun perin lähetettyjen tavujen lukumäärä (sekä 32- että 64-bittisillä alustoilla). NFS-tiedostojärjestelmien kanssa vain ensimmäinen hetki aikaleimaa muutetaan lukemalla pieniä tietovirtoja, myöhemmät puhelut eivät tee niin. Se laukaisee asiakaskohtaisten määritteiden välimuistiin tallentamisen, koska vaikka kaikki eivät olekaan, NFS-asiakkaat lopettavat päivityksen palvelimelle st_atime (viimeisen tiedoston käyttöajan) kautta ja asiakkaan puskurista täytetyt asiakaspuolen lukemat eivät laukaisisi muutoksia st- palvelimella, koska palvelinpuolen lukemia ei ole käytettävissä. Poistamalla asiakaspuolen attribuuttien välimuisti, UNIX-metatietoja voidaan käyttää, mutta tämä lisäisi merkittävästi palvelimen kuormitusta ja vaikuttaisi tuottavuuteen useimmissa tapauksissa.

Esimerkki 01:

Tässä on C-ohjelma, joka osoittaa lukutoiminnon kutsun Linux-järjestelmässä. Kirjoita alla oleva komento uuteen tiedostoon. Lisää kirjastoja ja alusta päätoiminnossa kuvaus ja koko. Kuvaaja avaa tiedostoa ja tiedostotietojen lukemiseen käytetään kokoa.

Yllä olevan koodin lähtö olisi kuten alla olevassa kuvassa.

Esimerkki 02:

Toinen esimerkki lukutoiminnon toiminnan havainnollistamiseksi on annettu alla.

Luo toinen tiedosto ja kirjoita alla oleva koodi sen muodossa. Tässä on kaksi kuvaajaa, fd1 ja fd2, joilla molemmilla on oma avoimen taulukon tiedostojen käyttöoikeus. Joten foobarille.txt, jokaisella kuvaajalla on tiedoston sijainti. Ensimmäinen foobar-tavu.txt käännetään fd2: sta, ja tulos on c = f, ei c = o.

Johtopäätös

Olemme lukeneet C-ohjelmoinnin POSIX-lukutoiminnon tehokkaasti. Toivottavasti epäilyksiä ei ole jäljellä.

Top 10 Games to Play on Ubuntu
Windows platform has been one of the dominating platforms for gaming because of the huge percentage of games that are developing today to natively sup...
5 parasta arcade-peliä Linuxille
Nykyään tietokoneet ovat vakavia koneita, joita käytetään pelaamiseen. Jos et pääse uusiin korkeisiin pisteisiin, tiedät mitä tarkoitan. Tässä viestis...
Battle For Wesnoth 1.13.6 Development Released
Battle For Wesnoth 1.13.6 released last month, is the sixth development release in the 1.13.x series and it delivers a number of improvements, most no...