C programozás

POSIX Read funkció a C programozásban

POSIX Read funkció a C programozásban
A hagyományos POSIX-kompatibilis operációs rendszerekben a fájlrendszerben található dokumentumok információinak megszerzéséhez egy program az olvasási rendszer hívását használta. A fájl definiálja azt a dokumentumleírót, amelyhez általában egy előzetes hívásból lehet hozzáférni. Ez az olvasott rendszerhívás kiolvassa a bájtokban lévő információkat és a hívó által a dokumentumban megadott egész számot, majd elmenti a hívó mechanizmus által biztosított pufferbe.

Funkció meghatározása

Mielőtt meghatározná a kódban az olvasási függvényt, be kell írnia néhány szükséges csomagot.

#include

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

>> ssize_t pread (int fájlok, void * buf, size_t nbyte, off_t offset);
>> ssize_t read (int fd, void * buf, size_t nbyte);

Három paraméteres argumentum vehető fel a read metódus hívásából:

int fd: A fájl fájlleírója, ahonnan az információkat be kell olvasni. Vagy használhatunk egy nyílt rendszerhívás útján megszerzett fájlleírót, vagy használhatunk 0, 1 vagy 2 értéket, amelyek tipikus bemenetre, normál kimenetre vagy szabályos hibára utalnak, ill.

Érvénytelen * buf: Az a puffer vagy karaktertömb, amelyben az olvasott adatokat el kell menteni és meg kell őrizni.

Size_t nbyte: A bájtok száma, amelyeket csonkolás előtt ki kellett olvasni a dokumentumból. Minden információ tárolható a pufferben, ha az elolvasandó információ rövidebb, mint nbyte.

Leírás

A read () metódus megpróbálja az „nbyte” bájtokat beolvasni a „buf” által jelzett puffer gyorsítótárba akár a „Fildes”, akár az „fd” nyílt dokumentumleíróhoz kapcsolt fájlból. Nem határozza meg ugyanabban az adatfolyamban, a FIFO-ban vagy a végberendezésben egyszerre több olvasás jellegét.

Azokat a dokumentumokat, amelyek lehetővé teszik az olvasást, 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, nincsenek olvasott bájtok, és a read () nem eredményez semmit.

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

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

Visszatérési érték

Az eléréskor visszavont „read” és „pread” bájtok számának nem negatív egésznek kell lennie, míg a fájl végére nulla pontot kell adni. A dokumentum pozíciója ezzel a számmal halad, vagy pedig hibát jelez, a metódusok -1-et adnak vissza, és hozzárendelik az 'errno' szót. Ha ez az adat kisebb, mint a kért bájtok száma, akkor nem hiba bájt. Lehetséges, hogy egyelőre kevesebb bájt áll rendelkezésre.

Hibák

A pread and read funkció sikertelen lesz, ha a következő hibák fordulnak elő:

EAGAIN:

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

EWOULDBLOCK:

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

EBADF:

Az „fd” lehet, hogy nem használható leíró, vagy nem lehet olvasni.

EFAULT:

Ez akkor történik, amikor a „buf” az elérhető címterületen kívül található.

EINTR:

Az információs adatok leolvasása előtt a hívás jelre szakadhatott.

EINVAL:

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

EINVAL:

Az „fd” leíró valószínűleg a timerfd_create (2) hívásának felhasználásával jött létre, és a helytelen méretű puffert olvashatták.

EIO:

Ez egy bemeneti / kimeneti hiba. Akkor fordul elő, amikor a háttérfolyamat-csoport megpróbál olvasni a szabályozó termináljáról, és az egyik vagy a másik figyelmen kívül hagyja vagy blokkolja a SIGTTIN-t, vagy folyamatcsoportja elesik. A hiba másik oka lehet alacsony szintű bemeneti / kimeneti hiba, miközben a merevlemezről vagy szalagról olvas. A hálózati adatfájlok esetében az EIO másik lehetséges oka a fájlleíró tanácsadói zárolásának megszüntetése és a zárolás 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. A size_t és az ssize_t űrlapok jelöletlenek és megjelölt numerikus adattípusok, amelyeket a POSIX határoz meg.1. Linuxon 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, mind 64 bites platformokon). Az NFS fájlrendszerekkel csak az első pillanatban változtatja meg az időbélyeget apró információáramok beolvasásával, a későbbi hívások ezt nem tennék meg. Ezt az ügyféloldali attribútumok gyorsítótára váltja ki, mivel bár nem minden, az NFS-ügyfelek abbahagyják a szerverre való frissítést az st_atime (utolsó fájlelérési idő) útján, és az ügyfél pufferéből teljesített ügyféloldali olvasások nem váltanák ki az st- a szerveren, mivel nem állnak rendelkezésre szerveroldali leolvasások. Az ügyféloldali attribútum-gyorsítótár eltávolításával elérhetik a UNIX-metaadatokat, de ez jelentősen növelné a szerver terhelését és a legtöbb esetben befolyásolná a termelékenységet.

01. példa:

Itt van egy C program az olvasási függvényhívás bemutatására a Linux rendszeren. Írja be az alábbi parancsot úgy, ahogy egy új fájlban van. 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éretet a fájl adatainak olvasására használják.

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

02. példa:

Az alábbiakban egy másik példát mutatunk be az olvasási függvény működésének bemutatására.

Hozzon létre egy másik fájlt, és írja le az alábbi kódot, ahogy benne van. Itt van két leíró, az fd1 és az fd2, amelyek mindkettőnek megvan a saját nyitott tábla fájlhoz való hozzáférése. Tehát a foobar számára.txt, minden leírónak megvan a fájl helye. A foobar legelső bájtja.A txt-t lefordítják az fd2-ből, és az eredmény c = f, nem pedig 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.

Az OSD-fedvény megjelenítése teljes képernyős Linux-alkalmazásokban és játékokban
Teljes képernyős játékok lejátszása vagy alkalmazások figyelemelterelés nélküli, teljes képernyős módban történő használata elvághatja a panelen vagy ...
Az 5 legjobb játékrögzítő kártya
Mindannyian láttuk és szerettük a YouTube-on a streaming játékokat. A PewDiePie, a Jakesepticye és a Markiplier csak néhány a legnépszerűbb játékosok ...
Hogyan lehet játékot fejleszteni Linuxon
Egy évtizeddel ezelőtt nem sok Linux-felhasználó jósolta, hogy kedvenc operációs rendszerük egy napon a videojátékok népszerű játékplatformja lesz. El...