POSIX olvasási funkció a C programozásban

Posix Read Function C Programing



A hagyományos POSIX -kompatibilis operációs rendszerekben egy program a fájlrendszerben található dokumentumokból származó információk lekéréséhez használta az olvasási rendszerhívást. Az a dokumentumleíró, amely általában egy korábbi hívásból érhető el a megnyitáshoz, a fájl határozza meg. Ez az olvasási rendszerhívás kiolvassa a bájtban lévő információkat és a hívó által megadott egész számot a dokumentumból, majd elmenti a hívómechanizmus által biztosított pufferbe.

Funkció meghatározása

Mielőtt meghatározná az olvasási funkciót a kódjában, be kell vennie néhány kötelező csomagot.







#befoglalni

Így határozza meg a POSIX olvasási funkciót:



>>ssize_t pread(intelefántcsont,üres *buf,size_tnbyte, off_t offset);
>>ssize_t olvasni(intfd,üres *buf,size_tnbyte);

Az olvasási metódus hívásából három paraméter argumentum vehető ki:



int fd: Annak a fájlnak a fájlleírója, ahonnan az információt olvasni kell. Lehet, hogy egy nyílt rendszerhíváson keresztül megszerzett fájlleírót használunk, vagy használhatunk 0 -t, 1 -et vagy 2 -t, ami tipikus bemenetre, szabályos kimenetre vagy szabályos hibára utal.





Üres *buf: Az a puffer vagy karakter tömb, amelyben az olvasott adatokat el kell menteni és meg kell őrizni.

Méret_t nbyte: Azon bájtok száma, amelyeket le kellett olvasni a dokumentumból a csonkítás előtt. Minden információ tárolható a pufferben, ha az olvasandó információ rövidebb, mint nbyte.



Leírás

A read () metódus megpróbálja beolvasni az „nbyte” bájtokat a „buf” által hivatkozott puffer gyorsítótárba a „Fildes” vagy „fd” nyílt dokumentumleíróval összekapcsolt fájlból. Nem határozza meg ugyanazon adatfolyamon, FIFO -n vagy terminálegységen több egyidejű olvasás jellegét.

Az olvasást lehetővé tevő dokumentumokon az olvasási folyamat a dokumentum eltolásával kezdődik, és az eltolást növeli az olvasott bájtok száma. Ha a dokumentum eltolása a fájl szélén vagy azon túl van, akkor nincsenek olvasott bájtok, és a read () nem ad semmit.

Ha a szám 0, a read () felismeri az alább említett hibákat. Ha nincsenek hibák, vagy ha a read () nincs elszámolva a hibákkal, akkor a read () nullát ad 0 -val, és ezért nincs más következménye.

Ha a szám magasabb, mint az SSIZE_MAX, a POSIX.1 szerint, akkor az eredményt a megvalósítás határozza meg.

Visszaadott érték

Az eléréskor visszaállított „olvasott” és „előre elkészített” bájtok számának nem negatív egész számnak kell lennie, míg a nulla a fájl végére mutat. A dokumentum pozíciója ezzel a számmal halad előre, vagy ha hibát jelez, a metódusok -1 -et adnak vissza, és „errno” -ot rendelnek hozzá. Ha ez az érték kisebb, mint a kért bájtok száma, akkor ez nem hiba. Lehetséges, hogy egyelőre kevesebb bájt áll rendelkezésre.

Hibák

A pread és olvasási funkció sikertelen lesz, ha a következő hibák fordulnak elő:

EAGAIN:

Az „fd” dokumentum vagy fájlleíró egy nem foglalatos fájlhoz tartozik, amelyet nem blokkolónak (O NONBLOCK) jelöltek, és blokkolja az olvasást.

EWOULDBLOCK:

Az „fd” leíró egy aljzathoz tartozik, amelyet nem blokkolónak (O_NONBLOCK) jelöltek, és blokkolja az olvasást.

EBADF:

Előfordulhat, hogy az „fd” nem használható leíró, vagy nem olvasható.

EFAULT:

Ez akkor fordul elő, ha a „buf” az elérhető címetéren kívül van.

EINTR:

Az információs adatok beolvasása előtt előfordulhat, hogy egy hívás megszakította a hívást.

KIVÁLASZTÁS:

Ez a hiba akkor fordul elő, ha az „fd” leírója olyan objektumban van, amely nem alkalmas az olvasásra, vagy a dokumentumot az O_DIRECT jelzővel oldották fel, és a „buf” -ban megadott egyik vagy másik cím, a „count” érték ', vagy a dokumentum eltolása nincs megfelelően társítva.

KIVÁLASZTÁS:

Lehet, hogy az „fd” leíró a timerfd_create (2) hívásával jött létre, és nem megfelelő méretű puffert adott meg olvasásra.

EIO:

Ez egy bemeneti/kimeneti hiba. Ez akkor fordul elő, amikor a háttérfolyamat -csoport megpróbál olvasni a szabályozó termináljáról, és egyik vagy másik figyelmen kívül hagyja vagy blokkolja a SIGTTIN -t, vagy a folyamatcsoportja megszakad. A hiba másik oka lehet alacsony szintű bemeneti/kimeneti hiba, miközben merevlemezről vagy szalagról olvas. Egy másik lehetséges oka az EIO -nak a hálózati adatfájlokban a tanácsadó zárolás eltávolítása a fájlleírón, és a zár meghibásodása.

EISDIR:

Az „fd” fájlleíró egy könyvtárhoz tartozik.

Megjegyzések:

Sok más hiba is előfordulhat, az „fd” leíróhoz kapcsolt objektumtól függően. Mind a size_t, mind a ssize_t űrlap jelöletlen és megjelölt numerikus adattípus, amelyet a POSIX.1 határoz meg. Linux rendszeren legfeljebb 0x7ffff000 (2 147 479 552) bájt továbbítható olvasási funkcióval (és ezzel egyenértékű rendszerhívásokkal), visszaadva az eredetileg továbbított bájtok számát (mind 32 bites, mind 64 bites platformon). Az NFS fájlrendszereknél az első pillanatban az időbélyeg megváltozik az apró információáramok olvasásával, a későbbi hívások ezt nem teszik meg. Ezt az ügyféloldali attribútumok gyorsítótárazása váltja ki, mivel-bár nem mindegyik-az NFS-ügyfelek abbahagyják a szerverre történő frissítést az st_atime (utolsó fájlhozzáférési idő) útján, és az ügyfél pufferéből teljesített ügyféloldali leolvasások nem indítják el az st. időben a kiszolgálón, mivel nem állnak rendelkezésre szerveroldali leolvasások. Az ügyféloldali attribútumok gyorsítótárazásának eltávolításával elérhetők a UNIX metaadatok, de ez jelentősen megnövelné a szerver terhelését, és a legtöbb esetben befolyásolná a termelékenységet.

Példa 01:

Itt van egy C program, amely bemutatja az olvasási függvény hívását a Linux rendszeren. Írja be az alábbi parancsot egy új fájlban. Adjon hozzá könyvtárakat, és a fő funkcióban inicializálja a leírót és a méretet. A leíró megnyitja a fájlt, és a méret a fájladatok olvasására szolgál.

A fenti kód kimenete az alábbi képen látható.

Példa 02:

Az olvasási függvény működését szemléltető másik példa az alábbiakban található.

Hozzon létre egy másik fájlt, és írja le az alábbi kódot. Íme két leíró, az fd1 és az fd2, amelyek mindkettőhöz saját nyílt táblázatfájl -hozzáférés tartozik. Tehát a foobar.txt esetében minden leírónak megvan a fájlhelye. A foobar.txt legelső bájtja fd2 -ből van lefordítva, és az eredmény c = f, nem c = o.

Következtetés

Hatékonyan olvastuk a POSIX olvasási funkciót a C programozásban. Remélhetőleg nem maradtak kétségek.