Funktionsdefinition
Før du definerer læsefunktionen i din kode, skal du medtage nogle nødvendige pakker.
#omfatteSå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.