POSIX funkcija čitanja u C programiranju

Posix Read Function C Programing

U tradicionalnim operativnim sustavima kompatibilnim s POSIX -om, program je za dobivanje informacija iz dokumenta koji se nalazi u datotečnom sustavu koristio čitani sistemski poziv. Deskriptor dokumenta kojem se obično pristupa iz prethodnog poziva za otvaranje definira datoteka. Ovaj sistemski poziv za čitanje čita informacije u bajtovima i cijeli broj koji pozivatelj navodi iz dokumenta, a zatim ih sprema u međuspremnik koji osigurava mehanizam za pozivanje.

Definicija funkcije

Prije nego što definirate funkciju čitanja u svom kodu, morate uključiti neke potrebne pakete.



#uključi

Evo kako definirate funkciju čitanja POSIX -a:



>>ssize_t pread(intslonovača,poništiti *buf,veličina_tnbyte, off_t pomak);
>>ssize_t čitanje(intF D,poništiti *buf,veličina_tnbajta);

Iz poziva metode čitanja mogu se uzeti tri argumenta parametra:



int fd: Deskriptor datoteke odakle se podaci čitaju. Mogli bismo ili koristiti deskriptor datoteke stečen otvorenim sistemskim pozivom, ili jednostavno koristiti 0, 1 ili 2 koji se odnose na tipičan unos, redovni izlaz ili redovnu pogrešku.

Void *buf: Međuspremnik ili niz znakova u kojemu bi se trebali spremati i čuvati pročitani podaci.

Veličina_t nbajt: Broj bajtova koje je trebalo pročitati iz dokumenta prije skraćivanja. Sve informacije mogu se pohraniti u međuspremnik ako su informacije za čitanje kraće od nbajta.



Opis

Metoda read () pokušava pročitati 'nbyte' bajtove u međuspremnik na koji upućuje 'buf' bilo iz datoteke povezane s deskriptorom otvorenog dokumenta 'Fildes' ili 'fd'. Ne definira prirodu nekoliko istovremenih očitavanja na istom toku, FIFO -u ili terminalnoj jedinici.

Na dokumentima koji omogućuju čitanje, proces čitanja započinje s pomakom dokumenta, a pomak se povećava za broj pročitanih bajtova. Ako je pomak dokumenta na rubu datoteke ili izvan nje, nema pročitanih bajtova, a read () ne daje ništa.

Kad je odbrojavanje 0, read () će prepoznati dolje navedene pogreške. Ako nema pogrešaka ili ako read () nije uračunat u pogreške, read () daje nulu s brojem 0 i stoga nema drugih posljedica.

Ako je broj veći od SSIZE_MAX, prema POSIX.1, tada je ishod određen implementacijom.

Povratna vrijednost

Broj bajtova 'čitanje' i 'pread' koji su vraćeni nakon postizanja mora biti cijeli niz koji nije negativan, dok nula pokazuje na kraj datoteke. Položaj dokumenta napreduje za ovaj broj, ili kako bi označili pogrešku, metode vraćaju -1 i dodjeljuju 'errno'. Kada je ova brojka manja od broja zatraženih bajtova, to nije greška. Moguće je da je za sada dostupno manje bajtova.

Pogreške

Pread i read funkcija neće biti uspješna ako se pojave ove pogreške:

EAGAIN:

Deskriptor dokumenta ili datoteke 'fd' pripada datoteci koja nije utičnica i koja je označena kao neblokirajuća (O NBLOKIRANJE) i blokirat će čitanje.

EWOULDBLOCK:

Deskriptor 'fd' pripada utičnici koja je označena kao neblokirajuća (O_NONBLOCK) i blokirat će čitanje.

EBADF:

'Fd' možda nije upotrebljiv opis ili možda nije otvoren za čitanje.

ZNAČAJNO:

To se događa kada je vaš 'buf' izvan vašeg dosegljivog adresnog prostora.

EINTR:

Prije čitanja informacijskih podataka, poziv je možda prekinuo signal.

IZBOR:

Ova se pogreška javlja kada je vaš 'fd' deskriptor uključen u objekt, koji nije prikladan za čitanje, ili je dokument odvezan zastavicom O_DIRECT, a jedna ili druga adresa navedena u 'buf', vrijednost navedena u 'count ', ili pomak dokumenta nije odgovarajuće povezan.

IZBOR:

Deskriptor 'fd' možda je formiran pozivom na timerfd_create (2), a međuspremnik pogrešne veličine dat je za čitanje.

EPZO:

To je greška ulaza/izlaza. To se događa kada pozadinska grupa procesa pokušava čitati sa svog regulatornog terminala, a jedno ili drugo previđa ili blokira SIGTTIN, ili je njegova grupa procesa ožalošćena. Drugi razlog za ovu pogrešku mogla bi biti pogreška ulaza/izlaza niske razine u međuvremenu čitanje s tvrdog diska ili trake. Drugi mogući uzrok EIO -a na umreženim podatkovnim datotekama je uklanjanje savjetodavnog zaključavanja na deskriptoru datoteka i neuspjeh tog zaključavanja.

EISDIR:

Deskriptor datoteke 'fd' pripada direktoriju.

Bilješke:

Mogu se pojaviti i mnoge druge pogreške, ovisno o objektu koji je povezan s deskriptorom 'fd'. Oblici size_t i ssize_t neoznačeni su i označeni numerički tipovi podataka definirani POSIX.1. Na Linuxu se najviše 0x7ffff000 (2,147,479,552) bajtova može prenijeti funkcijom čitanja (i ekvivalentnim sistemskim pozivima), vraćajući broj izvorno prenesenih bajtova (i na 32-bitnoj i na 64-bitnoj platformi). S datotečnim sustavima NFS, samo u prvom trenutku kada se vremenska oznaka promijeni čitanjem malih tokova informacija, naknadni pozivi to ne bi učinili. Pokreće se keširanjem atributa na strani klijenta jer, iako ne svi, NFS klijenti prestaju ažurirati na poslužitelj putem st_atime (posljednje vrijeme pristupa datoteci), a čitanja na strani klijenta ispunjena iz međuspremnika klijenta ne bi pokrenula promjene st- atime na poslužitelju jer nisu dostupna očitanja na strani poslužitelja. Uklanjanjem predmemoriranja atributa na strani klijenta može se pristupiti UNIX metapodacima, no to bi značajno povećalo opterećenje poslužitelja i u većini slučajeva utjecalo na produktivnost.

Primjer 01:

Ovdje je C program za demonstriranje poziva funkcije čitanja na Linux sustavu. Napišite naredbu ispod kako je u novoj datoteci. Dodajte knjižnice, a u glavnoj funkciji inicijalizirajte deskriptor i veličinu. Deskriptor otvara datoteku, a veličina se koristi za čitanje podataka datoteke.

Izlaz za gornji kôd bio bi prikazan kao na donjoj slici.

Primjer 02:

Drugi primjer za ilustraciju rada funkcije čitanja dat je u nastavku.

Napravite drugu datoteku i zapišite donji kod onakav kakav je u njemu. Evo dva deskriptora, fd1 & fd2, koji imaju svoj pristup datotekama otvorene tablice. Dakle, za foobar.txt svaki deskriptor ima svoju lokaciju datoteke. Prvi bajt foobar.txt preveden je iz fd2, a rezultat je c = f, a ne c = o.

Zaključak

Učinkovito smo pročitali funkciju čitanja POSIX -a u C programiranju. Nadajmo se da više nema dvojbi.