C Programmering

POSIX Lesefunksjon i C-programmering

POSIX Lesefunksjon i C-programmering
I tradisjonelle POSIX-kompatible operativsystemer, for å få informasjon fra et dokument som finnes i et filsystem, brukte et program den leste systemanropet. En dokumentbeskrivelse som vanligvis er tilgjengelig fra en tidligere samtale for å åpne, er definert av filen. Dette lese-systemanropet leser ut informasjonen i byte og heltallet som den som ringer spesifiserer fra dokumentet, og lagrer den deretter i en buffer levert av anropsmekanismen.

Funksjonsdefinisjon

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

#inkludere

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

Installer det siste OpenRA-strategispillet på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spillmotor som gjenskaper de tidlige Westwood-spillene som den klassiske Command & Conquer: Red Alert. Di...
Installer nyeste Dolphin Emulator for Gamecube & Wii på Linux
Dolphin Emulator lar deg spille de valgte Gamecube- og Wii-spillene dine på Linux Personal Computers (PC). Som en fritt tilgjengelig og åpen kildekod...
Hvordan bruke GameConqueror Cheat Engine i Linux
Artikkelen dekker en guide om bruk av GameConqueror-juksemotoren i Linux. Mange brukere som spiller spill på Windows bruker ofte "Cheat Engine" -appli...