C Programmeren

POSIX-leesfunctie in C-programmering

POSIX-leesfunctie in C-programmering
In traditionele POSIX-compatibele besturingssystemen, om informatie te krijgen uit een document in een bestandssysteem, gebruikte een programma de leessysteemaanroep. Een documentdescriptor die gewoonlijk wordt geopend via een eerdere oproep om te openen, wordt gedefinieerd door het bestand. Deze leessysteemaanroep leest de informatie in bytes en het gehele getal waarvan de beller opgeeft uit het document, en slaat het vervolgens op in een buffer die wordt geleverd door het aanroepende mechanisme.

Functiedefinitie

Voordat u de leesfunctie in uw code definieert, moet u enkele vereiste pakketten opnemen.

#include

Zo definieert u de POSIX-leesfunctie:

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

Er kunnen drie parameterargumenten worden overgenomen uit de read-methodeaanroep:

int fd: De bestandsdescriptor van het bestand waaruit de informatie moet worden gelezen. We kunnen ofwel een bestandsdescriptor gebruiken die is verkregen via een open systeemaanroep, of we kunnen gewoon 0, 1 of 2 gebruiken die respectievelijk verwijzen naar typische invoer, reguliere uitvoer of reguliere fout.

Nietig *buf: De buffer of tekenreeks waarin de gelezen gegevens moeten worden opgeslagen en bewaard.

Grootte_t nbyte: Het aantal bytes dat uit het document moest worden gelezen voordat het werd afgekapt. Alle informatie kan in de buffer worden opgeslagen als de te lezen informatie korter is dan nbytes.

Omschrijving

De methode read() probeert 'nbyte'-bytes te lezen in de buffercache waarnaar wordt verwezen door 'buf' uit het bestand dat is gekoppeld aan de open documentdescriptor 'Fildes' of 'fd'. Het definieert niet de aard van meerdere gelijktijdige leesbewerkingen op dezelfde stream, FIFO of terminaleenheid.

Op documenten die het lezen mogelijk maken, begint het leesproces bij de offset van het document en wordt de offset verhoogd met het aantal gelezen bytes. Als de documentoffset zich op of buiten de rand van het bestand bevindt, zijn er geen bytes gelezen en levert read() geen op.

Wanneer de telling 0 is, zal read() de onderstaande fouten herkennen. Als er geen fouten zijn, of als read() niet wordt verantwoord met fouten, levert een read() nul op met een telling van 0 en heeft daarom geen andere gevolgen.

Als het aantal hoger is dan SSIZE_MAX, volgens POSIX.1, dan wordt de uitkomst bepaald door de implementatie.

Winstwaarde

Het aantal bytes 'read' en 'pread' dat wordt teruggedraaid bij het behalen moet een niet-negatief geheel getal zijn, terwijl nul naar het einde van het bestand wijst. De documentpositie wordt verhoogd met dit nummer, of anders, om een ​​fout aan te duiden, retourneren de methoden -1 en wijzen 'errno' toe. Wanneer dit getal kleiner is dan het aantal gevraagde bytes, is het geen foutbyte. Het kan zijn dat er voorlopig minder bytes beschikbaar zijn.

fouten

De pread- en read-functie zal niet werken als deze fouten optreden:

OPNIEUW:

De document- of bestandsdescriptor 'fd' behoort tot een niet-socketbestand dat is gelabeld als niet-blokkerend (ON NONBLOCK) en blokkeert het lezen.

EWOULBLOK:

De descriptor 'fd' hoort bij een socket die is gemarkeerd als niet-blokkerend (O_NONBLOCK) en blokkeert de uitlezing.

EBADF:

De 'fd' is mogelijk geen bruikbare descriptor, of het is mogelijk niet open om te lezen.

EFAULT:

Dit gebeurt wanneer je 'buf' zich buiten je bereikbare adresruimte bevindt.

EINTR:

Voordat de informatiegegevens zijn gelezen, kan de oproep zijn afgebroken door een signaal.

EINVAL:

Deze fout treedt op wanneer uw 'fd'-descriptor betrokken is bij een object dat niet geschikt is om te lezen, of wanneer het document is losgemaakt met de O_DIRECT-vlag en een of ander adres wordt vermeld in 'buf', de waarde aangegeven in 'count ', of de documentoffset is niet correct gekoppeld.

EINVAL:

De descriptor 'fd' is mogelijk gevormd met een aanroep van timerfd_create(2), en de onjuiste groottebuffer is gegeven om te lezen.

EIO:

Het is een invoer-/uitvoerfout. Het treedt op wanneer de achtergrondprocesgroep probeert te lezen van de regelgevende terminal, en de een of de ander SIGTTIN over het hoofd ziet of blokkeert, of de procesgroep wordt beroofd. Een andere reden voor deze fout kan een invoer-/uitvoerfout op laag niveau zijn tijdens het lezen van een harde schijf of tape. Een andere mogelijke oorzaak van EIO op netwerkgegevensbestanden is het verwijderen van adviserende vergrendeling op de bestandsdescriptor en het falen van die vergrendeling.

EISDIR:

De bestandsdescriptor 'fd' hoort bij een map.

Opmerkingen:

Er kunnen ook veel andere fouten optreden, afhankelijk van het object dat is gekoppeld aan descriptor 'fd'. Zowel de formulieren size_t als ssize_t zijn ongemarkeerde en gemarkeerde numerieke gegevenstypen gedefinieerd door POSIX.1. Op Linux kunnen maximaal 0x7ffff000 (2.147.479.552) bytes worden verzonden door de leesfunctie (en equivalente systeemaanroepen), waarbij het aantal oorspronkelijk verzonden bytes wordt geretourneerd (op zowel 32-bits als 64-bits platforms). Met NFS-bestandssystemen, alleen het eerste moment dat de tijdstempel wordt gewijzigd door het lezen van kleine stroompjes informatie, zouden volgende oproepen dit niet doen. Het wordt geactiveerd door caching van client-side attributen aangezien, hoewel niet alle, NFS-clients stoppen met updaten naar de server via st_atime (laatste bestandstoegangstijd) en client-side reads die zijn vervuld vanuit de buffer van de client, zouden geen wijzigingen in st-atime veroorzaken. atime op de server omdat er geen server-side metingen beschikbaar zijn. Door attribuutcaching aan de clientzijde te verwijderen, kan toegang worden verkregen tot UNIX-metadata, maar dit zou de belasting van de server aanzienlijk verhogen en in de meeste gevallen de productiviteit beïnvloeden.

Voorbeeld 01:

Hier is een C-programma om de leesfunctie-aanroep op het Linux-systeem te demonstreren:. Schrijf het onderstaande commando zoals het is in een nieuw bestand. Bibliotheken toevoegen en in de hoofdfunctie een descriptor en grootte initialiseren. De descriptor opent het bestand en de grootte wordt gebruikt om bestandsgegevens te lezen.

De uitvoer voor de bovenstaande code zou zijn zoals weergegeven in de onderstaande afbeelding:.

Voorbeeld 02:

Een ander voorbeeld om de werking van de leesfunctie te illustreren wordt hieronder gegeven:.

Maak nog een bestand aan en schrijf de onderstaande code op zoals deze erin staat. Hier zijn twee descriptors, fd1 & fd2, die beide hun eigen open-tabel bestandstoegang hebben. Dus voor foobar.txt, elke descriptor heeft zijn bestandslocatie. De allereerste byte van foobar.txt is vertaald uit fd2, en het resultaat is c = f, niet c = o.

Conclusie

We hebben de POSIX-leesfunctie in C-programmering efficiënt gelezen. Hopelijk zijn er geen twijfels meer.

OpenTTD-zelfstudie
OpenTTD is een van de meest populaire simulatiegames voor bedrijven die er zijn. In dit spel moet je een geweldig transportbedrijf creëren. U begint e...
SuperTuxKart voor Linux
SuperTuxKart is een geweldige titel die is ontworpen om je de Mario Kart-ervaring gratis te bieden op je Linux-systeem. Het is behoorlijk uitdagend en...
Strijd om Wesnoth Zelfstudie
The Battle for Wesnoth is een van de meest populaire open source strategiespellen die je op dit moment kunt spelen. Dit spel is niet alleen al heel la...