C Programmering

POSIX läsfunktion i C-programmering

POSIX läsfunktion i C-programmering
I traditionella POSIX-kompatibla operativsystem, för att få information från ett dokument som finns i ett filsystem, använde ett program det lästa systemanropet. En dokumentbeskrivare som vanligtvis nås från ett tidigare samtal för att öppnas definieras av filen. Detta lästa systemanrop läser upp informationen i byte och det heltal som den som ringer specificerar från dokumentet och sparar den sedan i en buffert som tillhandahålls av anropsmekanismen.

Funktionsdefinition

Innan du definierar läsfunktionen i din kod måste du inkludera några paket som krävs.

#omfatta

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

>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);
>> ssize_t läs (int fd, void * buf, size_t nbytes);

Tre parameterargument kan hämtas från läsmetodsanropet:

int fd: Filbeskrivaren för filen från vilken informationen ska läsas. Vi kan antingen använda en filbeskrivare som förvärvats via ett öppet systemanrop, eller så kan vi bara använda 0, 1 eller 2 med hänvisning till typisk inmatning, vanlig utgång eller vanligt fel, respektive.

Ogiltig * buf: Bufferten eller karaktärsuppsättningen där den lästa informationen ska sparas och sparas.

Storlek_t nbyte: Antalet byte som behövde läsas ur dokumentet innan det trunkeras. All information kan lagras i bufferten om informationen som ska läsas är kortare än nbyte.

Beskrivning

Read () -metoden försöker läsa 'nbyte' byte i buffertcachen som 'buf' hänvisar till från antingen filen som är ansluten till den öppna dokumentbeskrivaren 'Fildes' eller 'fd'. Det definierar inte typen av flera samtidiga läsningar på samma ström, FIFO eller terminalenhet.

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

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

Om antalet är högre än SSIZE_MAX, enligt POSIX.1, då bestäms resultatet av genomförandet.

Returvärde

Siffran för byte 'läst' och 'förord' som återställs vid uppnåendet måste vara ett icke-negativt heltal medan noll pekar mot slutet av filen. Dokumentpositionen förflyttas av 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 ett misstag. Det kan vara möjligt att färre byte är tillgängliga för tillfället.

Fel

För- och läsfunktionen misslyckas om dessa fel uppstår:

VIDARE:

Dokumentet eller filbeskrivaren 'fd' tillhör en icke-sockelfil som har märkts som icke-blockerande (O NONBLOCK) och kommer att blockera läsningen.

EWOULDBLOCK:

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

EBADF:

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

EFAULT:

Detta händer när din "buf" ligger utanför ditt adressutrymme som kan nås.

EINTR:

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

EINVAL:

Det här felet inträffar när din 'fd' deskriptor är inblandad i ett objekt, som inte är lämpligt för läsning, eller om dokumentet lades upp med O_DIRECT-flaggan, och en eller annan adress anges i 'buf', det värde som anges i 'count ', eller dokumentförskjutningen är inte korrekt associerad.

EINVAL:

Beskrivningen 'fd' kan ha bildats med hjälp av ett samtal för att timerfd_create (2), och fel storlek buffert har fått läsa.

EIO:

Det är ett in / ut-fel. Det inträffar när bakgrundsprocessgruppen försöker läsa från sin regulatoriska terminal, och den ena eller den andra har utsikt över eller blockerar SIGTTIN, eller dess processgrupp är sönder. En annan anledning till detta fel kan vara in- / utgångsfel på låg nivå under läsningen från en hårddisk eller tejp. En annan potentiell orsak till EIO på datafiler i nätverk är avlägsnande av rådgivande låsning av filbeskrivaren och fel på det låset.

EISDIR:

Filbeskrivaren 'fd' tillhör en katalog.

Anmärkningar:

Många andra fel kan också inträffa, beroende av objektet länkat till deskriptor 'fd'. Både storlek_t och ssize_t-former är omärkta och markerade numeriska datatyper definierade av POSIX.1. På Linux kan högst 0x7ffff000 (2 147 479 552) byte överföras med läsfunktion (och motsvarande systemanrop), vilket returnerar antalet byte som ursprungligen överförts (på både 32-bitars och 64-bitars plattformar). Med NFS-filsystem ändras bara första ögonblicket tidsstämpeln genom att läsa små informationsströmmar, efterföljande samtal skulle inte göra det. Det utlöses genom cachning av attribut på klientsidan eftersom, trots att inte alla, slutade NFS-klienter uppdatera till servern via st_atime (senaste filåtkomsttid) och klientsidesläsningar som fullbordats från klientens buffert skulle inte utlösa ändringar i st- åtminstone på servern eftersom inga avläsningar på serversidan är tillgängliga. Genom att ta bort caching för attribut på klientsidan kan UNIX-metadata nås, men detta skulle avsevärt öka belastningen på servern och påverka produktiviteten i de flesta fall.

Exempel 01:

Här är ett C-program för att visa läsfunktionsanropet på Linux-systemet. Skriv kommandot nedan som i en ny fil. Lägg till bibliotek, och i huvudfunktionen, initialisera en deskriptor och storlek. Beskrivningen öppnar filen och storleken används för att läsa fildata.

Utgången 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 ny fil och skriv ner koden nedan som den finns i den. Här är två beskrivare, fd1 och fd2, som båda har sin egen öppna tabellfilåtkomst. Så för foobar.txt, varje beskrivare har 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äsfunktion i C-programmering effektivt. Förhoppningsvis finns det inga tvivel kvar.

OpenTTD vs Simutrans
Att skapa din egen transportsimulering kan vara rolig, avkopplande och extremt lockande. Det är därför du måste se till att du testar så många spel so...
OpenTTD-handledning
OpenTTD är ett av de mest populära affärssimuleringsspelen där ute. I det här spelet måste du skapa en underbar transportaffär. Du kommer dock att bör...
SuperTuxKart för Linux
SuperTuxKart är en fantastisk titel som är utformad för att ge dig Mario Kart-upplevelsen gratis på ditt Linux-system. Det är ganska utmanande och rol...