Datei lesen
In diesem Abschnitt werden die Lesesubroutinen beschrieben.
Datei lesen
| Subroutine | Beschreibung |
|---|---|
| lesen | Subroutine, die eine angegebene Anzahl Byte aus einer offenen Datei in einen angegebenen Puffer kopiert. Die Kopie beginnt an dem Punkt, der durch den aktuellen Offset angegeben wird. Die Anzahl Byte und der Puffer werden durch die Parameter NByte und Puffer angegeben. |
Die Subroutine read führt Folgendes aus:
- Stellt sicher, dass der FileDescriptor -Parameter gültig ist und dass der Prozess über read -Berechtigungen verfügt. Die Subroutine ruft dann den durch den Parameter FileDescriptor angegebenen Dateitabelleneintrag ab.
- Setzt ein Flag in der Datei, um anzuzeigen, dass eine Leseoperation in Bearbeitung ist. Diese Aktion sperrt andere Prozesse aus der Datei während der Operation.
- Konvertiert den Offset-Bytewert und den Wert der Variablen NBytes in eine Blockadresse.
- Überträgt den Inhalt des angegebenen Blocks in einen Speicherpuffer.
- Kopiert den Inhalt des Speicherpuffers in den mit der Variablen Puffer angegebenen Bereich.
- Aktualisiert den aktuellen Offset entsprechend der Anzahl der tatsächlich gelesenen Byte. Das Zurücksetzen des Offsets stellt sicher, dass die Daten nacheinander beim nächsten Lesevorgang gelesen werden.
- Zieht die Anzahl der gelesenen Byte von der in der Variablen NByte angegebenen Gesamtzahl ab.
- Durchläuft eine Schleife, bis die Anzahl der zu lesenden Bytes erreicht ist.
- Gibt die Gesamtzahl der gelesenen Byte zurück.
Der Zyklus wird abgeschlossen, wenn die zu lesende Datei leer ist, die Anzahl der angeforderten Bytes erreicht ist oder während des Prozesses ein Lesefehler auftritt.
Um eine zusätzliche Iteration in der Leseschleife zu vermeiden, starten Sie Leseanforderungen am Anfang der Datenblockgrenzen und müssen ein Vielfaches der Datenblockgröße sein. Wenn ein Prozess sequenziell liest, geht das Betriebssystem davon aus, dass alle nachfolgenden Lesevorgänge ebenfalls sequenziell sind.
Während der Leseoperation ist der I-Node gesperrt. Andere Prozesse dürfen den Inhalt der Datei nicht ändern, während ein Lesevorgang in Bearbeitung ist. Die Datei wird jedoch sofort nach Abschluss der Leseoperation entsperrt. Wenn ein anderer Prozess die Datei zwischen zwei Leseoperationen ändert, sind die resultierenden Daten unterschiedlich, aber die Integrität der Datenstruktur wird beibehalten.
#include <fcntl.h>
#include <sys/param.h>
main()
{
int fd;
int nbytes;
int nnulls;
int i;
char buf[PAGESIZE]; /*A convenient buffer size*/
nnulls=0;
if ((fd = open("foo",O_RDONLY)) < 0)
exit();
while ((nbytes = read(fd,buf,sizeof(buf))) > 0)
for (i = 0; i < nbytes; i++)
if (buf[i] == '\0';
nnulls++;
printf("%d nulls found\n", nnulls);
}