POSIX-leesfunctie in C-programmering:

Posix Read Function C Programing



In traditionele POSIX-compatibele besturingssystemen, om informatie te krijgen van 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 verschaft door het aanroepmechanisme.

Functiedefinitie

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







#erbij betrekken

Zo definieert u de POSIX-leesfunctie:



>>ssize_t pread(intivoor,leegte *buf,size_tnbyte, off_t offset);
>>ssize_t gelezen(intfd,leegte *buf,size_tnbytes);

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.



Beschrijving

De methode read() probeert 'nbyte'-bytes in 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 aan of voorbij de rand van het bestand is, 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 de telling hoger is dan SSIZE_MAX, volgens POSIX.1, dan wordt de uitkomst bepaald door de implementatie.

Winstwaarde

Het aantal bytes 'read' en 'pread' dat na voltooiing wordt teruggedraaid, 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-socket-bestand 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 meting.

EBADF:

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

EFAULT:

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

EINTR:

Voorafgaand aan het lezen van informatiegegevens kan de oproep zijn afgebroken door een signaal.

SELECTIE:

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.

SELECTIE:

De descriptor 'fd' kan zijn 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 zijn 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 directory.

Opmerkingen:

Er kunnen ook veel andere fouten optreden, afhankelijk van het object dat is gekoppeld aan descriptor 'fd'. Zowel size_t als ssize_t formulieren zijn ongemarkeerde en gemarkeerde numerieke datatypes 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 aanroep van de leesfunctie op het Linux-systeem te demonstreren. Schrijf het onderstaande commando zoals het is in een nieuw bestand. Voeg bibliotheken toe en initialiseer in de hoofdfunctie een descriptor en grootte. 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 noteer de onderstaande code zoals die erin staat. Hier zijn twee descriptors, fd1 & fd2, die beide hun eigen open-tabelbestandstoegang hebben. Dus voor foobar.txt heeft elke descriptor 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 uitgelezen. Hopelijk zijn er geen twijfels meer.