C Programiranje

POSIX funkcija čitanja u C programiranju

POSIX funkcija čitanja u C programiranju
U tradicionalnim operativnim sustavima kompatibilnim s POSIX-om, za dobivanje informacija iz dokumenta koji se nalazi u datotečnom sustavu, program je koristio čitani sistemski poziv. Datoteka definira deskriptor dokumenta kojem se obično pristupa iz prethodnog poziva za otvaranje. Ovaj sistemski poziv za čitanje očitava informacije u bajtovima i cijeli broj koji pozivatelj navodi iz dokumenta, a zatim ih sprema u međuspremnik koji pruža mehanizam pozivanja.

Definicija funkcije

Prije definiranja funkcije čitanja u kodu, morate uključiti neke potrebne pakete.

#include

Evo kako definirate POSIX funkciju čitanja:

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

Iz poziva metode čitanja mogu se preuzeti tri parametra parametra:

int fd: Deskriptor datoteke odakle će se informacije čitati. Mogli bismo koristiti deskriptor datoteke stečen otvorenim sistemskim pozivom ili bismo mogli koristiti 0, 1 ili 2 koji se odnosi na tipični ulaz, redoviti izlaz ili redovitu pogrešku.

Praznina * buf: Međuspremnik ili niz znakova u kojem se pročitani podaci trebaju spremati i čuvati.

Size_t nbyte: Broj bajtova koje je trebalo pročitati iz dokumenta prije skraćivanja. Sve se informacije mogu pohraniti u međuspremnik ako su informacije koje se čitaju kraće od nbajta.

Opis

Metoda read () pokušava pročitati bajtove 'nbyte' u predmemoriju međuspremnika na koju se odnosi 'buf' bilo iz datoteke povezane s otvorenim opisom dokumenta 'Fildes' ili 'fd'. Ne definira prirodu nekoliko istodobnih čitanja na istom toku, FIFO-u ili terminalnoj jedinici.

Na dokumentima koji omogućuju čitanje, postupak čitanja započinje odmakom dokumenta, a odmak se povećava za broj pročitanih bajtova. Ako je pomak dokumenta na rubu datoteke ili izvan njega, nema pročitanih bajtova, a read () ih ne daje.

Kad je broj 0, read () prepoznat će dolje spomenute pogreške. Ako nema pogrešaka ili ako se čitanje () ne obračunava s pogreškama, čitanje () daje nulu s brojem 0 i stoga nema drugih posljedica.

Ako je broj veći od SSIZE_MAX, prema POSIX-u.1, tada se ishod određuje provedbom.

Povratna vrijednost

Broj bajtova 'read' i 'pread' vraćen nakon postizanja mora biti negativan cijeli broj dok nula pokazuje na kraj datoteke. Položaj dokumenta napreduje ovim brojem, ili inače, što znači grešku, metode vraćaju -1 i dodjeljuju 'errno'. Kada je ova brojka manja od broja bajtova koji se traže, to nije bajt s pogreškom. Moglo bi biti moguće da je za sada dostupno manje bajtova.

Pogreške

Funkcija predčitanja i čitanja neće biti uspješna ako se pojave ove pogreške:

EAGAIN:

Deskriptor dokumenta ili datoteke 'fd' pripada datoteci bez utičnice koja je označena kao neblokirajuća (O NONBLOCK) 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 deskriptor ili možda nije otvoren za čitanje.

NAPAD:

To se događa kada je vaš "buf" izvan vašeg dostupnog adresnog prostora.

EINTR:

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

EINVAL:

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

EINVAL:

Deskriptor 'fd' možda je oblikovan pozivom na timerfd_create (2), a neispravni je međuspremnik veličine za čitanje.

EIO:

To je pogreška ulaza / izlaza. To se događa kada pozadinska procesna grupa pokušava čitati sa svog regulatornog terminala, a jedan ili drugi previđa ili blokira SIGTTIN ili je njegova procesna grupa ožalošćena. Drugi razlog ove pogreške može biti pogreška ulaza / izlaza na niskoj razini u međuvremenu čitanje s tvrdog diska ili trake. Drugi potencijalni uzrok EIO na umreženim datotekama je uklanjanje savjetodavnog zaključavanja na opisu datoteke i neuspjeh tog zaključavanja.

EISDIR:

Deskriptor datoteke 'fd' pripada direktoriju.

Bilješke:

Mogu se pojaviti i mnoge druge pogreške, ovisne o objektu povezanom s deskriptorom 'fd'. I oblici size_t i ssize_t neoznačeni su i označeni numeričkim vrstama podataka definiranim POSIX-om.1. Na Linuxu se funkcija čitanja (i ekvivalentni sistemski pozivi) mogu poslati najviše 0x7ffff000 (2.147.479.552) bajtova, vraćajući broj bajtova izvorno poslanih (na 32-bitnoj i 64-bitnoj platformi). S NFS datotečnim sustavima, samo u prvom trenutku kada se vremenska oznaka promijeni čitanjem sitnih tokova informacija, sljedeći pozivi to ne bi učinili. Pokreće se predmemoriranjem atributa na strani klijenta, iako, iako ne svi, NFS klijenti prekidaju ažuriranje na poslužitelju putem st_atime (vrijeme zadnjeg pristupa datoteci), a očitavanja na strani klijenta ispunjena iz međuspremnika klijenta ne bi pokrenula promjene u st- atime na poslužitelju jer nisu dostupna očitanja sa strane poslužitelja. Uklanjanjem predmemoriranja atributa na strani klijenta može se pristupiti UNIX metapodacima, ali to bi u većini slučajeva značajno povećalo opterećenje poslužitelja i utjecalo na produktivnost.

Primjer 01:

Ovdje je program C za demonstraciju poziva funkcije čitanja na Linux sustavu. Zapišite naredbu ispod u novu datoteku. Dodajte biblioteke i u glavnoj funkciji inicijalizirajte deskriptor i veličinu. Deskriptor otvara datoteku, a veličina se koristi za čitanje podataka datoteke.

Izlaz za gornji kod bio bi kao što je prikazano na donjoj slici.

Primjer 02:

Slijedi još jedan primjer koji ilustrira rad funkcije čitanja.

Stvorite drugu datoteku i zapišite donji kod onakav kakav je u njemu. Evo dva deskriptora, fd1 i fd2, koji oba imaju svoj pristup datoteci otvorene tablice. Tako i za foobar.txt, svaki deskriptor ima svoje mjesto datoteke. Prvi bajt foobara.txt je preveden s fd2, a rezultat je c = f, a ne c = o.

Zaključak

Učinkovito smo pročitali funkciju POSIX čitanja u programiranju na jeziku C. Nadam se da više nema dvojbi.

Zamijenite svoje tipke miša različito za različiti softver pomoću X-Mouse Button Control
Možda vam treba alat koji bi mogao promijeniti kontrolu miša sa svakom aplikacijom koju koristite. Ako je to slučaj, možete isprobati aplikaciju pod n...
Microsoft Sculpt Touch bežični miš pregled
Nedavno sam čitao o Microsoft Sculpt Touch bežični miš i odlučio ga kupiti. Nakon što sam ga neko vrijeme koristio, odlučio sam s njim podijeliti svoj...
Trackpad i pokazivač miša na ekranu AppyMouse za Windows tablete
Korisnicima tableta često nedostaje pokazivač miša, posebno kada su navični koristiti prijenosna računala. Pametni telefoni i tableti osjetljivi na do...