POSIX-Lesefunktion in der C-Programmierung

Posix Read Function C Programing



In traditionellen POSIX-kompatiblen Betriebssystemen verwendet ein Programm den Systemaufruf read, um Informationen aus einem Dokument zu erhalten, das in einem Dateisystem enthalten ist. Ein Dokumentdeskriptor, auf den normalerweise von einem vorherigen Aufruf zum Öffnen zugegriffen wird, wird durch die Datei definiert. Dieser Systemaufruf lesen liest die Informationen in Bytes und die ganze Zahl, die der Aufrufer angibt, aus dem Dokument aus und speichert sie dann in einem Puffer, der vom aufrufenden Mechanismus bereitgestellt wird.

Funktionsdefinition

Bevor Sie die Lesefunktion in Ihrem Code definieren, müssen Sie einige erforderliche Pakete einfügen.







#enthalten

So definieren Sie die POSIX-Lesefunktion:



>>ssize_t pread(intElfenbein,Leere *buff,Größe_tnbyte, off_t Offset);
>>ssize_t lesen(intfd,Leere *buff,Größe_tnbytes);

Drei Parameterargumente können dem Aufruf der Methode read entnommen werden:



int fd: Der Dateideskriptor der Datei, aus der die Informationen gelesen werden sollen. Wir könnten entweder einen Dateideskriptor verwenden, der über einen offenen Systemaufruf abgerufen wurde, oder wir könnten einfach 0, 1 oder 2 verwenden, die sich auf eine typische Eingabe, eine reguläre Ausgabe bzw. einen regulären Fehler beziehen.





Leere *buf: Der Puffer oder das Zeichenarray, in dem die gelesenen Daten gespeichert und aufbewahrt werden sollen.

Größe_t nbyte: Die Anzahl der Bytes, die vor dem Abschneiden aus dem Dokument gelesen werden mussten. Alle Informationen können im Puffer gespeichert werden, wenn die zu lesenden Informationen kürzer als nByte sind.



Beschreibung

Die Methode read() versucht, ‚nbyte‘ Bytes in den Puffer-Cache zu lesen, auf den ‚buf‘ verweist, entweder aus der Datei, die mit dem offenen Dokumentdeskriptor ‚Fildes‘ oder ‚fd‘ verbunden ist. Es definiert nicht die Natur mehrerer gleichzeitiger Lesevorgänge auf demselben Datenstrom, FIFO oder Terminaleinheit.

Bei Dokumenten, die das Lesen ermöglichen, beginnt der Lesevorgang am Offset des Dokuments und der Offset wird um die Anzahl der gelesenen Bytes erhöht. Befindet sich der Dokumentversatz am oder jenseits des Dateirands, werden keine Bytes gelesen und read() liefert keine.

Wenn der Zähler 0 ist, erkennt read() die unten genannten Fehler. Liegen keine Fehler vor oder wird read() nicht mit Errors verrechnet, liefert ein read() null mit einem Zählerstand von 0 und hat daher keine weiteren Auswirkungen.

Wenn die Anzahl gemäß POSIX.1 höher als SSIZE_MAX ist, wird das Ergebnis von der Implementierung bestimmt.

Rückgabewert

Die Zahl der Bytes „read“ und „pred“, die bei Erreichen zurückgesetzt werden, muss eine nicht negative ganze Zahl sein, während Null auf das Ende der Datei zeigt. Die Position des Dokuments wird um diese Nummer weitergezählt, oder um einen Fehler anzuzeigen, geben die Methoden -1 zurück und weisen 'errno' zu. Wenn diese Zahl kleiner ist als die angeforderte Anzahl von Bytes, handelt es sich nicht um ein Fehlerbyte. Es ist möglich, dass vorerst weniger Bytes verfügbar sind.

Fehler

Die Vorlese- und Lesefunktion schlägt fehl, wenn diese Fehler auftreten:

WIEDER:

Der Dokument- oder Dateideskriptor „fd“ gehört zu einer Nicht-Socket-Datei, die als nicht blockierend (O NONBLOCK) gekennzeichnet wurde und das Lesen blockiert.

EWOULDBLOCK:

Der Deskriptor ‚fd‘ gehört zu einem Socket, der als nicht-blockierend (O_NONBLOCK) gekennzeichnet wurde und das Lesen blockiert.

EBADF:

Das „fd“ ist möglicherweise kein brauchbarer Deskriptor oder kann nicht gelesen werden.

AUSFALL:

Dies geschieht, wenn sich Ihr „buf“ außerhalb Ihres erreichbaren Adressraums befindet.

EINTR:

Vor dem Lesen von Informationsdaten kann der Anruf durch ein Signal unterbrochen worden sein.

AUSWAHL:

Dieser Fehler tritt auf, wenn Ihr 'fd'-Deskriptor an einem Objekt beteiligt ist, das nicht zum Lesen geeignet ist, oder das Dokument mit dem O_DIRECT-Flag gelöst wurde und die eine oder andere Adresse in 'buf' angegeben ist, der Wert in 'count ', oder der Dokumentenversatz ist nicht richtig zugeordnet.

AUSWAHL:

Der Deskriptor 'fd' wurde möglicherweise durch einen Aufruf von timerfd_create(2) gebildet und der Puffer mit der falschen Größe wurde zum Lesen übergeben.

EIO:

Es handelt sich um einen Eingabe-/Ausgabefehler. Es tritt auf, wenn die Hintergrundprozessgruppe versucht, von ihrem Regulierungsterminal zu lesen, und der eine oder andere SIGTTIN übersieht oder blockiert oder ihre Prozessgruppe hinterlässt. Ein weiterer Grund für diesen Fehler könnte ein Low-Level-Ein-/Ausgabefehler beim Lesen von einer Festplatte oder einem Band sein. Eine weitere mögliche Ursache für EIO bei vernetzten Datendateien ist die Entfernung der beratenden Sperrung des Dateideskriptors und das Fehlschlagen dieser Sperre.

EISDIR:

Der Dateideskriptor ‚fd‘ gehört zu einem Verzeichnis.

Anmerkungen:

Es können auch viele andere Fehler auftreten, abhängig von dem Objekt, das mit dem Deskriptor „fd“ verknüpft ist. Sowohl die size_t- als auch die ssize_t-Form sind unmarkierte und markierte numerische Datentypen, die von POSIX.1 definiert werden. Unter Linux können höchstens 0x7ffff000 (2.147.479.552) Bytes durch die Lesefunktion (und entsprechende Systemaufrufe) übertragen werden, wobei die Anzahl der ursprünglich übertragenen Bytes zurückgegeben wird (sowohl auf 32-Bit- als auch auf 64-Bit-Plattformen). Bei NFS-Dateisystemen wird der Zeitstempel nur im ersten Moment durch das Lesen winziger Informationsströme geändert, nachfolgende Aufrufe würden dies nicht tun. Es wird durch das Caching von clientseitigen Attributen ausgelöst, da, obwohl nicht alle NFS-Clients die Aktualisierung auf den Server über st_atime (letzte Dateizugriffszeit) beenden und clientseitige Reads, die aus dem Puffer des Clients ausgeführt werden, keine Änderungen an st- atime auf dem Server, da keine serverseitigen Messwerte verfügbar sind. Durch das Entfernen des clientseitigen Attributcachings kann auf UNIX-Metadaten zugegriffen werden, was jedoch die Serverlast erheblich erhöhen und in den meisten Fällen die Produktivität beeinträchtigen würde.

Beispiel 01:

Hier ist ein C-Programm, um den Lesefunktionsaufruf auf dem Linux-System zu demonstrieren. Schreiben Sie den untenstehenden Befehl so wie er ist in eine neue Datei. Fügen Sie Bibliotheken hinzu und initialisieren Sie in der Hauptfunktion einen Deskriptor und eine Größe. Der Deskriptor öffnet die Datei und die Größe wird zum Lesen der Dateidaten verwendet.

Die Ausgabe für den obigen Code wäre wie im folgenden Bild gezeigt.

Beispiel 02:

Ein weiteres Beispiel zur Veranschaulichung der Funktionsweise der Lesefunktion ist unten angegeben.

Erstellen Sie eine weitere Datei und schreiben Sie den Code unten so auf, wie er darin enthalten ist. Hier sind zwei Deskriptoren, fd1 & fd2, die beide ihren eigenen Zugriff auf offene Tabellendateien haben. Für foobar.txt hat also jeder Deskriptor seinen Dateispeicherort. Das allererste Byte von foobar.txt wird aus fd2 übersetzt und das Ergebnis ist c = f, nicht c = o.

Abschluss

Wir haben die POSIX-Lesefunktion in der C-Programmierung effizient gelesen. Hoffentlich bleiben keine Zweifel mehr.