POSIX Læsefunktion i C -programmering

Posix Read Function C Programing



I traditionelle POSIX -kompatible operativsystemer brugte et program læste systemopkald for at få oplysninger fra et dokument i et filsystem. En dokumentbeskrivelse, der normalt er tilgængelig fra et tidligere opkald for at åbne, defineres af filen. Dette læste systemopkald læser oplysningerne i bytes og det helt tal, som opkalderen angiver fra dokumentet, og gemmer det derefter i en buffer leveret af opkaldsmekanismen.

Funktionsdefinition

Inden du definerer læsefunktionen i din kode, skal du inkludere nogle nødvendige pakker.





#omfatte

Sådan definerer du POSIX -læsningsfunktionen:



>>ssize_t pread(intelfenben,ugyldig *buf,størrelse_tnbyte, off_t offset);
>>størrelse_t læst(intfd,ugyldig *buf,størrelse_tnbytes);

Tre parameterargumenter kan tages fra læsemetodeopkaldet:



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





Bortfalder *buf: Bufferen eller tegnsætningen, hvor de læste data skal gemmes og opbevares.

Size_t nbyte: Antallet af bytes, der skulle læses fra dokumentet før afkortning. Alle oplysninger kan gemmes i bufferen, hvis de oplysninger, der skal læses, er kortere end nbytes.



Beskrivelse

Metoden read () forsøger at læse 'nbyte' bytes i buffercachen, 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 strøm, FIFO eller terminalenhed.

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

Når tællingen er 0, vil read () genkende nedenstående fejl. Hvis der ikke er nogen fejl, eller hvis read () ikke er redegjort for med fejl, giver en read () nul med et tal på 0 og har derfor ingen andre konsekvenser.

Hvis antallet er højere end SSIZE_MAX i henhold til POSIX.1, bestemmes resultatet af implementeringen.

Returværdi

Tallet af bytes 'læst' og 'pread', der vendes tilbage ved 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, returnerer metoderne -1 og tildeler 'errno'. Når dette tal er mindre end antallet af krævede bytes, er det ikke en fejlbyte. Det kan være muligt, at færre bytes er tilgængelige for nu.

Fejl

Pread og read -funktionen vil ikke lykkes, hvis disse fejl opstår:

IGEN:

Dokumentet eller filbeskrivelsen 'fd' tilhører en fil uden stikkontakter, der er blevet mærket som ikke-blokerende (O NONBLOCK) og vil blokere læsningen.

EWOULDBLOCK:

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

EBADF:

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

EFAULT:

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

EINTR:

Inden læsningen af ​​informationsdata kan opkaldet være brudt op af et signal.

UDVÆLGELSE:

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

UDVÆLGELSE:

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

EIO:

Det er en input/output fejl. Det opstår, når baggrundsprocesgruppen forsøger at læse fra sin regulatoriske terminal, og den ene eller den anden overser eller blokerer SIGTTIN, eller dens procesgruppe forsvinder. En anden årsag til denne fejl kan være lav/lav 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 af filbeskrivelsen og fejl i denne lås.

EISDIR:

Filbeskrivelsen 'fd' tilhører et bibliotek.

Bemærkninger:

Mange andre fejl kan også forekomme, afhængigt af objektet, der er knyttet til deskriptor 'fd'. Både formaterne size_t og ssize_t er umærkede og markerede numeriske datatyper defineret af POSIX.1. På Linux kan højst 0x7ffff000 (2.147.479.552) bytes transmitteres ved læsningsfunktion (og tilsvarende systemopkald), hvilket returnerer antallet af bytes, der oprindeligt blev sendt (på både 32-bit og 64-bit platforme). Med NFS -filsystemer er det kun det første øjeblik, tidsstemplet ændres 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 det ikke er alle, stoppede med at opdatere til serveren via st_atime (sidste filadgangstid) og læsninger på klientsiden opfyldt fra buffer på klienten ikke ville udløse ændringer i st- atime på serveren, da der ikke er tilgængelige aflæsninger på serversiden. Ved at fjerne caching på attributsiden på klientsiden kan der tilgås UNIX-metadata, men dette vil øge belastningen på serveren betydeligt og påvirke produktiviteten i de fleste tilfælde.

Eksempel 01:

Her er et C -program til at demonstrere læsefunktionsopkaldet på Linux System. Skriv kommandoen herunder, 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 på billedet herunder.

Eksempel 02:

Et andet eksempel til illustration af funktionen af ​​læsefunktionen er givet nedenfor.

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

Konklusion

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