POSIX Läsfunktion i C -programmering

Posix Read Function C Programing



I traditionella POSIX -kompatibla operativsystem, för att få information från ett dokument som finns i ett filsystem, använde ett program läsesystemsamtalet. En dokumentbeskrivare som vanligtvis nås från ett tidigare samtal för att öppna definieras av filen. Detta läsesystemsamtal läser upp informationen i byte och det heltal som den som ringer anger från dokumentet och sparar den sedan i en buffert från anropsmekanismen.

Funktionsdefinition

Innan du läser funktionen i din kod måste du inkludera några paket.





#omfatta

Så här definierar du POSIX -läsfunktionen:



>>ssize_t pread(intelfenben,tomhet *buf,storlek_tnbyte, off_t offset);
>>ssize_t läst(intfd,tomhet *buf,storlek_tnbytes);

Tre parameterargument kan tas från läsmetodanropet:



int fd: Filbeskrivningen för filen varifrån informationen ska läsas. Vi kan antingen använda en filbeskrivning som förvärvats via ett öppet systemanrop, eller så kan vi bara använda 0, 1 eller 2 som hänvisar till typisk ingång, vanlig utmatning eller vanligt fel.





Ogiltig *buf: Bufferten eller teckenuppsättningen där lästa data ska sparas och sparas.

Size_t nbyte: Antalet byte som behövde läsas från dokumentet innan trunkeringen. All information kan lagras i bufferten om informationen som ska läsas är kortare än nbytes.



Beskrivning

Metoden read () försöker läsa 'nbyte' byte i buffertcachen som refereras av 'buf' från antingen filen som är ansluten till den öppna dokumentbeskrivaren 'Fildes' eller 'fd'. Det definierar inte karaktären hos flera samtidiga läsningar på samma ström, FIFO eller terminalenhet.

På dokument som möjliggör läsning börjar läsprocessen vid dokumentets förskjutning och förskjutningen ökas med antalet lästa byte. Om dokumentförskjutningen är vid eller bortom filens kant, läses inga byte och läs () ger ingen.

När räkningen är 0 kommer read () att känna igen de fel som nämns nedan. Om det inte finns några misstag, eller om läsning () inte redovisas med fel, ger en läsning () noll med ett antal 0 och har därför inga andra konsekvenser.

Om antalet är högre än SSIZE_MAX, enligt POSIX.1, bestäms resultatet av implementeringen.

Returvärde

Siffran byte 'läst' och 'förläst' som återställs vid prestation måste vara ett icke-negativt heltal medan noll pekar på slutet av filen. Dokumentpositionen går vidare med detta nummer, annars för att indikera ett fel, metoderna returnerar -1 och tilldelar 'errno'. När denna siffra är mindre än antalet begärda byte är det inte en felbyte. Det kan vara möjligt att färre byte är tillgängliga för tillfället.

Fel

Pread och läs -funktionen misslyckas om dessa fel uppstår:

IGEN:

Dokumentet eller filbeskrivningen 'fd' tillhör en fil utan hylsa som har märkts som icke-blockerande (O NONBLOCK) och kommer att blockera avläsningen.

EWOULDBLOCK:

Beskrivaren 'fd' tillhör ett uttag som har märkts som icke-blockerande (O_NONBLOCK) och kommer att blockera avläsningen.

EBADF:

'Fd' är kanske inte en användbar deskriptor, eller så är den kanske inte öppen för läsning.

EFAULT:

Detta händer när din 'buf' ligger utanför ditt tillgängliga adressutrymme.

EINTR:

Innan läsningen av informationsdata kan samtalet ha brutit upp av en signal.

URVAL:

Det här felet uppstår när din 'fd' -deskriptor är inblandad i ett objekt som inte är lämpligt för läsning, eller om dokumentet lossades med O_DIRECT -flaggan och en eller annan adress som anges i' buf ', värdet som anges i' count ' ', eller så är dokumentförskjutningen inte korrekt associerad.

URVAL:

Beskrivaren ‘fd’ kan ha bildats med hjälp av ett samtal till timerfd_create (2), och den felaktiga storleksbufferten har getts att läsa.

EIO:

Det är ett input/output -fel. Det uppstår när bakgrundsprocessgruppen försöker läsa från sin regulatoriska terminal, och den ena eller den andra förbiser eller blockerar SIGTTIN, eller dess processgrupp är bortkopplad. En annan orsak till detta fel kan vara lågnivå in/utfel under tiden läsning från en hårddisk eller band. En annan potentiell orsak till EIO på nätverksfiler är borttagning av rådgivande låsning av filbeskrivningen och misslyckandet av det låset.

EISDIR:

Filbeskrivningen ‘fd’ tillhör en katalog.

Anmärkningar:

Många andra fel kan också inträffa, beroende på objektet som är kopplat till deskriptorn ‘fd’. Både formaterna size_t och ssize_t är omärkta och markerade numeriska datatyper definierade av POSIX.1. På Linux kan högst 0x7ffff000 (2 147 479 552) byte överföras genom läsfunktion (och motsvarande systemanrop), vilket returnerar antalet byte som ursprungligen överfördes (på både 32-bitars och 64-bitars plattformar). Med NFS -filsystem, bara det första ögonblicket som tidsstämpeln ändras genom att läsa små informationsströmmar, skulle efterföljande samtal inte göra det. Det utlöses av cachning av attribut på klientsidan eftersom, även om inte alla, slutade NFS-klienter att uppdatera till servern via st_atime (senaste filåtkomsttid) och läsningar på klientsidan som uppfyllts från bufferten för klienten inte skulle utlösa ändringar i st- atime på servern eftersom det inte finns några avläsningar på serversidan. Genom att ta bort cachning av attribut på klientsidan kan UNIX-metadata komma åt, men detta skulle öka belastningen på servern avsevärt och påverka produktiviteten i de flesta fall.

Exempel 01:

Här är ett C -program för att demonstrera läsfunktionsanropet på Linux -systemet. Skriv kommandot nedan som det är i en ny fil. Lägg till bibliotek och initiera en beskrivning och storlek i huvudfunktionen. Beskrivaren öppnar filen och storleken används för att läsa fildata.

Utmatningen för ovanstående kod skulle vara som visas i bilden nedan.

Exempel 02:

Ett annat exempel för att illustrera funktionen för läsfunktionen ges nedan.

Skapa en annan fil och skriv ner koden nedan som den finns i den. Här är två deskriptorer, fd1 & fd2, som båda har sin egen öppna tabellfilåtkomst. Så för foobar.txt har varje deskriptor sin filplats. Den allra första byten av foobar.txt översätts från fd2, och resultatet är c ​​= f, inte c = o.

Slutsats

Vi har läst POSIX -läsfunktionen i C -programmering effektivt. Förhoppningsvis finns det inga tvivel kvar.