POSIX Lesefunksjon i C -programmering

Posix Read Function C Programing



I tradisjonelle POSIX -kompatible operativsystemer, for å få informasjon fra et dokument i et filsystem, brukte et program lesesystemet. En dokumentbeskrivelse som vanligvis er tilgjengelig fra et tidligere anrop for å åpne, er definert av filen. Denne leste systemanropet leser opp informasjonen i byte og heltallet som den som ringer spesifiserer fra dokumentet, og lagrer den deretter i en buffer levert av anropsmekanismen.

Funksjon Definisjon

Før du definerer lesefunksjonen i koden din, må du inkludere noen nødvendige pakker.





#inkludere

Slik definerer du POSIX -lesefunksjonen:



>>ssize_t pread(intelfenbein,tomrom *buf,størrelse_tnbyte, off_t offset);
>>størrelse_t lest(intfd,tomrom *buf,størrelse_tnbytes);

Tre parameterargumenter kan hentes fra lesemetodeanropet:



int fd: Filbeskrivelsen for filen der informasjonen skal leses. Vi kan enten bruke en filbeskrivelse som er anskaffet via et åpent systemanrop, eller vi kan bare bruke 0, 1 eller 2 som refererer til henholdsvis typisk inngang, vanlig utgang eller vanlig feil.





Ugyldig *buf: Bufferen eller tegnoppsettet der de lesede dataene skal lagres og lagres.

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 nbytes.



Beskrivelse

Metoden read () 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 lesingen, begynner leseprosessen ved forskyvningen av dokumentet, og forskyvningen økes med antall lesede byte. Hvis dokumentforskyvningen er ved eller utenfor filens kant, blir det ikke lest noen byte, og lesing () gir ingen.

Når tallet er 0, vil read () gjenkjenne feilene nevnt nedenfor. Hvis det ikke er noen feil, eller hvis read () ikke blir regnskapsført med feil, gir en read () null med et tall på 0 og har derfor ingen andre konsekvenser.

Hvis antallet er høyere enn SSIZE_MAX, i henhold til POSIX.1, blir resultatet bestemt av implementeringen.

Returverdi

Tallet for byte 'lest' og 'pread' som tilbakeføres ved prestasjon må være et ikke-negativt heltall mens null peker mot slutten av filen. Dokumentposisjonen skrider frem med dette nummeret, ellers for å indikere en feil, returnerer metodene -1 og tildeler '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

Pread og read -funksjonen vil mislykkes hvis disse feilene oppstår:

IGJEN:

Dokumentet eller filbeskrivelsen ‘fd’ tilhører en fil uten sokkel som er merket som ikke-blokkerende (O NONBLOCK) og vil blokkere lesingen.

EWOULDBLOCK:

Beskrivelsen 'fd' tilhører en sokkel som er merket som ikke-blokkerende (O_NONBLOCK) og vil blokkere avlesningen.

EBADF:

'Fd' er kanskje ikke en brukbar beskrivelse, eller den er kanskje ikke åpen for lesing.

EFAULT:

Dette skjer når 'buf' er utenfor ditt tilgjengelige adresserom.

EINTR:

Før avlesning av informasjonsdata kan samtalen ha brutt opp av et signal.

UTVALG:

Denne feilen oppstår når 'fd' -deskriptoren er involvert i et objekt som ikke er egnet for lesing, eller hvis dokumentet ble løsnet med O_DIRECT -flagget, og en eller annen adresse angitt i' buf ', verdien angitt i' count ' ', eller dokumentforskyvningen ikke er riktig assosiert.

UTVALG:

Beskrivelsen 'fd' kan ha blitt dannet ved hjelp av et anrop til timerfd_create (2), og feil størrelsesbuffer har blitt gitt for å lese.

EIO:

Det er en input/output -feil. Det oppstår når bakgrunnsprosessgruppen prøver å lese fra sin regulatoriske terminal, og den ene eller den andre overser eller blokkerer SIGTTIN, eller prosessgruppen er død. En annen årsak til denne feilen kan være inndata/utgangsfeil på lavt nivå, mens du leser fra en harddisk eller et bånd. En annen potensiell årsak til EIO på datafiler i nettverk er fjerning av rådgivende låsing på filbeskrivelsen og feil i låsen.

EISDIR:

Filbeskrivelsen 'fd' tilhører en katalog.

Merknader:

Mange andre feil kan også oppstå, avhengig av objektet som er knyttet til deskriptor ‘fd’. Både size_t og ssize_t -skjemaer er umerkede og merkede numeriske datatyper definert av POSIX.1. På Linux kan høyst 0x7ffff000 (2.147.479.552) byte overføres ved lesefunksjon (og tilsvarende systemanrop), og returnere antall byte som opprinnelig ble overført (på både 32-biters og 64-biters plattformer). Med NFS -filsystemer, bare i det første øyeblikket tidsstempelet endres ved å lese små informasjonsstrømmer, ville påfølgende samtaler ikke gjøre det. Det utløses av bufring av attributter på klientsiden siden, selv om ikke alle, sluttet NFS-klienter å oppdatere til serveren via st_atime (siste filtilgangstid) og leser på klientsiden som ble oppfylt fra bufferen til klienten, ikke ville utløse endringer i st- atime på serveren siden det ikke er noen avlesninger på serversiden. Ved å fjerne hurtigbufring for attributter på klientsiden kan UNIX-metadata nås, 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 under 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 koden ovenfor vil være som vist på bildet nedenfor.

Eksempel 02:

Et annet eksempel for å illustrere hvordan lesefunksjonen fungerer, er gitt nedenfor.

Lag en annen fil og skriv ned koden nedenfor slik den er i den. Her er to deskriptorer, fd1 og fd2, som begge har sin egen åpne tabellfiltilgang. Så for foobar.txt har hver deskriptor sin filplassering. Den aller første byten til foobar.txt er oversatt 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.