C Programmering

POSIX Læsefunktion i C-programmering

POSIX Læsefunktion i C-programmering
I traditionelle POSIX-kompatible operativsystemer, for at få information fra et dokument indeholdt i et filsystem, brugte et program det læste systemopkald. En dokumentbeskrivelse, som der normalt er adgang til fra et tidligere opkald for at åbne, er defineret af filen. Dette læste systemopkald læser informationen ud i bytes og det heltal, som den, der ringer, specificerer fra dokumentet og gemmer den derefter i en buffer, der leveres af opkaldsmekanismen.

Funktionsdefinition

Før du definerer læsefunktionen i din kode, skal du medtage nogle nødvendige pakker.

#omfatte

Sådan definerer du POSIX-læsefunktionen:

>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);
>> ssize_t læse (int fd, ugyldig * buf, størrelse_t nbytes);

Tre parameterargumenter kan tages fra læsemetodeopkaldet:

int fd: Filbeskrivelsen for filen, hvorfra oplysningerne skal læses. Vi bruger enten en filbeskrivelse, der er erhvervet via et åbent systemopkald, eller vi kan bare bruge henholdsvis 0, 1 eller 2 med henvisning til henholdsvis typisk input, regelmæssig output eller regelmæssig fejl.

Ugyldig * buf: Pufferen eller tegnarrayet, hvori de læste data skal gemmes og gemmes.

Størrelse_t nbyte: Antallet af bytes, der skulle læses fra dokumentet, før de afkortes. Al information kan gemmes i bufferen, hvis den information, der skal læses, er kortere end nbytes.

Beskrivelse

Read () -metoden forsøger at læse 'nbyte' bytes i den buffercache, der refereres til af 'buf' fra enten filen, der er forbundet med den åbne dokumentbeskrivelse 'Fildes' eller 'fd'. Det definerer ikke arten af ​​flere samtidige læsninger på den samme stream, FIFO eller terminalenhed.

På dokumenter, der muliggør læsning, begynder læsningsprocessen ved forskydningen af ​​dokumentet, og forskydningen øges med antallet af læste byte. Hvis dokumentforskydningen er ved eller uden for filens kant, læses der ingen bytes, og læsning () giver ingen.

Når optællingen er 0, vil read () genkende nedenstående fejl. Hvis der ikke er fejl, eller hvis der ikke tages højde for read () med fejl, giver en read () nul med et antal på 0 og har derfor ingen andre konsekvenser.

Hvis antallet er højere end SSIZE_MAX, som pr. POSIX.1, så bestemmes resultatet af implementeringen.

Returneringsværdi

Tallet på bytes, der 'læses' og 'indledende', der tilbageføres efter opnåelse, skal være et ikke-negativt heltal, mens nul peger på slutningen af ​​filen. Dokumentpositionen skrider frem med dette nummer, ellers for at angive en fejl, returneres metoderne -1 og tildeles 'errno'. Når dette tal er mindre end antallet af anmodede byte, er det ikke en fejlbyte. Det kan være muligt, at færre byte er tilgængelige indtil videre.

Fejl

For- og læse-funktionen mislykkes, hvis disse fejl opstår:

IGEN:

Dokumentet eller filbeskrivelsen 'fd' tilhører en ikke-sokkelfil, der er mærket som ikke-blokerende (O NONBLOCK) og blokerer læsningen.

EWOULDBLOCK:

Beskrivelsen 'fd' tilhører et stik, der er mærket som ikke-blokerende (O_NONBLOCK) og vil blokere læsningen.

EBADF:

'Fd' er muligvis ikke en anvendelig beskrivelse, eller den er muligvis ikke åben for læsning.

EFAULT:

Dette sker, når din 'buf' er uden for dit tilgængelige adresseområde.

EINTR:

Før læsning af informationsdata kan opkaldet være brudt op af et signal.

EINVAL:

Denne fejl opstår, når din 'fd' deskriptor er involveret i et objekt, som ikke er passende til læsning, eller hvis dokumentet blev bundet med O_DIRECT-flag, og den ene eller den anden adresse angivet i 'buf', værdien angivet i 'count ', eller dokumentforskydningen er ikke passende forbundet.

EINVAL:

Beskrivelsen 'fd' kan være dannet ved hjælp af et kald til timerfd_create (2), og den forkerte størrelsesbuffer er givet til at læse.

EIO:

Det er en input / output-fejl. Det sker, når baggrundsprocessgruppen forsøger at læse fra sin regulatoriske terminal, og den ene eller den anden overser eller blokerer SIGTTIN, eller dens procesgruppe er efterladt. En anden årsag til denne fejl kunne være lavt niveau input / output-fejl i mellemtiden læsning fra en harddisk eller et bånd. En anden potentiel årsag til EIO på netværksfiler er fjernelse af rådgivende låsning på filbeskriveren og svigt af denne lås.

EISDIR:

Filbeskrivelsen 'fd' hører til et bibliotek.

Bemærkninger:

Mange andre fejl kan også forekomme, afhængig af objektet, der er knyttet til deskriptor 'fd'. Både størrelse_t og ssize_t-formularer er umærkede og markerede numeriske datatyper defineret af POSIX.1. På Linux kan maksimalt 0x7ffff000 (2.147.479.552) bytes transmitteres ved læsefunktion (og tilsvarende systemopkald), hvilket returnerer antallet af oprindeligt transmitterede byte (på både 32-bit og 64-bit platforme). Med NFS-filsystemer ændres tidsstemplet bare i det første øjeblik ved at læse små informationsstrømme, efterfølgende opkald ville ikke gøre det. Det udløses ved caching af attributter på klientsiden, da NFS-klienter, selvom ikke alle, holder op med at opdatere til serveren via st_atime (sidste filadgangstid), og klient-side-læsninger, der er opfyldt fra klientens buffer, ikke udløser ændringer til st atime på serveren, da der ikke er nogen målinger på serversiden. Ved at fjerne caching af attributter på klientsiden kan man få adgang til UNIX-metadata, men dette vil i de fleste tilfælde øge belastningen på serveren betydeligt og påvirke produktiviteten.

Eksempel 01:

Her er et C-program til demonstration af læsefunktionskaldet på Linux-systemet. Skriv nedenstående kommando, som den er i en ny fil. Tilføj biblioteker, og initialiser en deskriptor og størrelse i hovedfunktionen. Beskrivelsen åbner filen, og størrelsen bruges til at læse fildata.

Outputtet for ovenstående kode ville være som vist i nedenstående billede.

Eksempel 02:

Et andet eksempel for at illustrere funktionen af ​​læse-funktionen er givet nedenfor.

Opret en anden fil, og skriv koden nedenfor, som den er i den. Her er to deskriptorer, fd1 & fd2, som begge har deres egen åbne tabelfiladgang. Så for foobar.txt, hver deskriptor har sin filplacering. Den allerførste byte af foobar.txt oversættes fra fd2, og resultatet er c = f, ikke c = o.

Konklusion

Vi har læst POSIX-læse-funktionen i C-programmering effektivt. Forhåbentlig er der ingen tvivl tilbage.

Mus Top 5 ergonomiske computermusprodukter til Linux
Top 5 ergonomiske computermusprodukter til Linux
Forårsager langvarig brug af computeren smerter i dit håndled eller fingre? Lider du af stive led og er konstant nødt til at ryste hænderne? Føler du ...
Mus Sådan ændres mus og touchpad-indstillinger ved hjælp af Xinput i Linux
Sådan ændres mus og touchpad-indstillinger ved hjælp af Xinput i Linux
De fleste Linux-distributioner leveres som standard med "libinput" -biblioteket til at håndtere inputhændelser på et system. Det kan behandle inputhæn...
Mus Remap dine museknapper forskelligt til anden software med X-Mouse Button Control
Remap dine museknapper forskelligt til anden software med X-Mouse Button Control
Måske har du brug for et værktøj, der kan ændre din muses kontrol med hver applikation, du bruger. Hvis dette er tilfældet, kan du prøve en applikatio...