Funksjonsdefinisjon
Før du definerer lesefunksjonen i koden din, må du inkludere noen nødvendige pakker.
#inkludereSlik definerer du POSIX-lesefunksjonen:
>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);>> ssize_t read (int fd, void * buf, size_t nbytes);
Tre parameterargumenter kan hentes fra lesemetoden:
int fd: Filbeskrivelsen til filen der informasjonen skal leses fra. Vi kan enten bruke en filbeskrivelse anskaffet via et åpent systemanrop, eller vi kan bare bruke 0, 1 eller 2 med henvisning til henholdsvis typisk inngang, vanlig utgang eller vanlig feil.
Ugyldig * buf: Bufferen eller tegnoppstillingen der de leste dataene skal lagres og oppbevares.
Size_t nbyte: Antall byte som måtte leses fra dokumentet før avkorting. All informasjon kan lagres i bufferen hvis informasjonen som skal leses er kortere enn nbyte.
Beskrivelse
Les () -metoden prøver å lese 'nbyte' byte i bufferbufferen referert til av 'buf' fra enten filen som er koblet til den åpne dokumentbeskrivelsen 'Fildes' eller 'fd'. Den definerer ikke arten til flere samtidige avlesninger på samme strøm, FIFO eller terminalenhet.
På dokumenter som muliggjør lesing, begynner leseprosessen ved forskyvningen av dokumentet, og forskyvningen økes med antall byte som er lest. Hvis dokumentforskyvningen er ved eller utenfor filens kant, blir det ikke lest byte, og read () gir ingen.
Når tellingen er 0, vil read () gjenkjenne feilene som er nevnt nedenfor. Hvis det ikke er noen feil, eller hvis read () ikke blir redegjort for med feil, gir en read () null med tallet 0 og har derfor ingen andre konsekvenser.
Hvis antallet er høyere enn SSIZE_MAX, i henhold til POSIX.1, så bestemmes utfallet av implementeringen.
Returverdi
Tallet på byte 'lest' og 'innlasting' som tilbakeføres ved oppnåelse, må være et ikke-negativt heltall mens null peker mot slutten av filen. Dokumentposisjonen videreføres av dette nummeret, ellers, for å indikere en feil, returnerer metodene -1 og tilordner 'errno'. Når dette tallet er mindre enn antall byte som er forespurt, er det ikke en feilbyte. Det kan være mulig at færre byte er tilgjengelige for nå.
Feil
Innlednings- og lesefunksjonen mislykkes hvis disse feilene oppstår:
IGJEN:
Dokumentet eller filbeskrivelsen 'fd' tilhører en fil uten stikkontakt som er merket som ikke-blokkerende (O NONBLOCK) og vil blokkere lesingen.
EWOULDBLOCK:
Beskrivelsen 'fd' tilhører en stikkontakt som er merket som ikke-blokkerende (O_NONBLOCK) og vil blokkere avlesningen.
EBADF:
'Fd' er kanskje ikke en brukbar beskrivelse, eller den kan ikke være åpen for lesing.
EFAULT:
Dette skjer når 'buf' er utenfor adresserommet du kan nå.
EINTR:
Før lesing av informasjonsdata kan samtalen ha brutt opp av et signal.
EINVAL:
Denne feilen oppstår når 'fd' deskriptoren din er involvert i et objekt, som ikke er passende for lesing, eller hvis dokumentet ble bundet med O_DIRECT-flagget, og en eller annen adresse angitt i 'buf', verdien angitt i 'count ', eller dokumentforskyvningen er ikke riktig assosiert.
EINVAL:
Beskrivelsen 'fd' kan ha blitt dannet ved hjelp av et kall til timerfd_create (2), og feil størrelse buffer har fått å lese.
EIO:
Det er en inn / ut-feil. Det oppstår når bakgrunnsprosessgruppen prøver å lese fra den regulatoriske terminalen, og den ene eller den andre overser eller blokkerer SIGTTIN, eller prosessgruppen blir etterlatt. En annen årsak til denne feilen kan være lavt nivå input / output feil i mellomtiden lesing fra en harddisk eller tape. En annen potensiell årsak til EIO på datafiler i nettverk er fjerning av rådgivende låsning av filbeskrivelsen og svikt i den låsen.
EISDIR:
Filbeskrivelsen 'fd' tilhører en katalog.
Merknader:
Mange andre feil kan også forekomme, avhengig av objektet som er knyttet til deskriptor 'fd'. Både formatene størrelse_t og ssize_t er umerkede og merkede numeriske datatyper definert av POSIX.1. På Linux kan maksimalt 0x7ffff000 (2,147,479,552) byte overføres ved lesefunksjon (og tilsvarende systemanrop), og returnerer antall byte som ble opprinnelig sendt (på både 32-biters og 64-biters plattformer). Med NFS-filsystemer endres tidsstemplet bare i første øyeblikk ved å lese små strømmer av informasjon, og påfølgende samtaler vil ikke gjøre det. Det utløses av hurtigbufring av attributter på klientsiden siden, selv om ikke alle, NFS-klienter slutter å oppdatere til serveren via st_atime (siste filtilgangstid) og klientsideslesinger som er oppfylt fra bufferen til klienten, ikke vil utløse endringer i st- atime på serveren, da det ikke er noe tilgjengelig på serversiden. Ved å fjerne caching av attributt på klientsiden, kan man få tilgang til UNIX-metadata, men dette vil øke belastningen på serveren betydelig og påvirke produktiviteten i de fleste tilfeller.
Eksempel 01:
Her er et C-program for å demonstrere lesefunksjonsanropet på Linux-systemet. Skriv kommandoen nedenfor slik den er i en ny fil. Legg til biblioteker, og initialiser en beskrivelse og størrelse i hovedfunksjonen. Beskrivelsen åpner filen, og størrelsen brukes til å lese fildata.
Utgangen for ovennevnte kode vil være som vist i bildet nedenfor.
Eksempel 02:
Et annet eksempel for å illustrere funksjonen til lesefunksjonen er gitt nedenfor.
Lag en ny fil og skriv ned koden nedenfor slik den er i den. Her er to beskrivelser, fd1 og fd2, som begge har sin egen åpne tabellfiltilgang. Så for foobar.txt, hver deskriptor har filplasseringen. Den aller første byte av foobar.txt oversettes fra fd2, og resultatet er c = f, ikke c = o.
Konklusjon
Vi har lest POSIX-lesefunksjonen i C-programmering effektivt. Forhåpentligvis er det ingen tvil igjen.