lseek - den Dateiversatz für lesen/schreiben verändern
Standard-C-Bibliothek (
libc,
-lc)
#include <unistd.h>
off_t lseek(int dd, off_t Versatz, int dorthin);
lseek() setzt den Versatz der mit dem Dateideskriptor
dd
verbundenen offenen Dateideskription gemäß der
dorthin-Anweisung auf das Argument
Versatz wie folgt:
- SEEK_SET
- Der Datei-Versatz wird auf Versatz byte
gesetzt.
- SEEK_CUR
- Der Datei-Versatz wird auf die aktuelle Position plus
Versatz byte gesetzt.
- SEEK_END
- Der Datei-Versatz wird auf die Dateigröße
plus Versatz byte gesetzt.
lseek() erlaubt es, den Versatz einer Datei hinter ihr Dateiende zu
setzen. (Das ändert aber nicht die Größe der Datei.) Wenn
dort später Daten geschrieben werden, geben Lesezugriffe auf die
Lücke zwischen der eigentlichen Datei und den neuen Daten solange
Nullbytes (»\0«) zurück, bis tatsächlich Daten in
die Lücke geschrieben werden.
Seit Version 3.1 unterstützt Linux die folgenden zusätzlichen
Werte für
dorthin:
- SEEK_DATA
- Einstellen des Dateiversatzes auf die nächste
Position in der Datei größer oder gleich Versatz, die
Daten enthält. Falls Versatz auf Daten zeigt, wird der
Datei-Versatz auf Versatz gesetzt.
- SEEK_HOLE
- Einstellen des Dateiversatzes auf die nächste
Lücke in der Datei größer oder gleich als
Versatz. Falls Versatz in ein Loch zeigt, wird der
Datei-Versatz auf Versatz gesetzt. Falls es hinter Versatz
keine Lücke gibt, wird der Datei-Versatz auf das Dateiende
eingestellt (d. h., am Ende jeder Datei gibt es ein implizites
Loch).
In beiden der obigen Fälle schlägt
lseek() fehl, wenn
Versatz hinter das Dateiende weist.
Diese Operationen ermöglichen Anwendungen, Löcher in einer Datei
mit verstreut zugewiesenem Speicherplatz (sparsely allocated file) abzubilden.
Dies kann nützlich sein für Anwendungen wie Werkzeuge für
Datei-Backups, die beim Erstellen von Backups Platz sparen und Löcher
erhalten können, wenn sie über einen Mechanismus für die
Erkennung von Löchern verfügen.
Für die Zwecke dieser Operationen ist ein Loch eine Sequenz von Nullen,
die (in der Regel) nicht in dem zugrunde liegenden Dateispeicher zugeordnet
sind. Jedoch ist ein Dateisystem nicht verpflichtet Löcher zu
berichten, sodass diese Operationen kein sicherer Mechanismus zum Abbilden des
tatsächlich einer Datei zugeordneten Speicherplatzes sind.
(Darüber hinaus wird eine Reihe von Nullen, die tatsächlich an
den zugrunde liegenden Speicher geschrieben wurde, nicht als ein Loch gemeldet
werden.) In der einfachsten Implementierung kann ein Dateisystem die
Operationen unterstützen, indem
SEEK_HOLE immer den Versatz des
Dateiendes und
SEEK_DATA immer den
Versatz zurück geben
(d.h. selbst wenn
Versatz auf ein Loch weist, kann dieses Loch als eine
Datensequenz angesehen werden, die aus Nullen besteht).
Das Featuretest-Makro
_GNU_SOURCE muss definiert sein, um die
Definitionen von
SEEK_DATA und
SEEK_HOLE von
<unistd.h> beziehen zu können.
Die Operationen
SEEK_HOLE und
SEEK_DATA werden von den folgenden
Dateisystemen unterstützt:
- •
- Btrfs (seit Linux 3.1)
- •
- OCFS (seit Linux 3.2)
- •
- XFS (seit Linux 3.5)
- •
- Ext4 (seit Linux 3.8)
- •
-
tmpfs(5) (seit Linux 3.8)
- •
- NFS (seit Linux 3.18)
- •
- FUSE (seit Linux 4.5)
- •
- GFS2 (seit Linux 4.15)
Nach erfolgreicher Ausführung gibt
lseek() die neue Position in
der Datei zurück, gemessen in Bytes vom Anfang der Datei. Anderenfalls
wird der Wert
(off_t) -1 zurückgegeben und
errno
gesetzt, um den den Fehler anzuzeigen.
- EBADF
-
dd ist kein Deskriptor für eine
geöffnete Datei.
- EINVAL
-
dorthin ist ungültig. Oder: der resultierende
Datei-Versatz wäre negativ oder hinter dem Ende eines
durchsuchbaren Geräts.
- ENXIO
-
dorthin ist SEEK_DATA oder SEEK_HOLE
und Versatz ist hinter dem Dateiende oder dorthin ist
SEEK_DATA und Versatz ist in einem Loch am Dateiende.
- EOVERFLOW
- Der resultierende Datei-Versatz kann nicht in einem
off_t dargestellt werden.
- ESPIPE
-
dd beschreibt eine Pipe, einen Socket oder ein
FIFO.
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.
SEEK_DATA und
SEEK_HOLE sind nicht standardisierte Erweiterungen,
die auch in Solaris, FreeBSD und DragonFly BSD vorkommen; sie sind zur
Aufnahme in die nächste POSIX-Revision (Ausgabe 8) vorgeschlagen.
In
open(2) finden Sie Erläuterungen zu den Beziehungen zwischen
Dateideskriptoren, offenen Dateideskriptionen und Dateien.
Falls der Dateistatusschalter
O_APPEND auf der offenen Datei-Deskription
gesetzt ist, verschiebt ein
write(2) unabhängig von der
Verwendung von
lseek() immer den Dateiversatz an das Ende der Datei.
Der Datentyp
off_t ist ein durch POSIX.1 spezifizierter
vorzeichenbehafteter Ganzzahldatentyp.
Manche Geräte unterstützen kein Suchen und POSIX legt nicht fest,
welche Geräte
lseek() unterstützen müssen.
Unter Linux schlägt die Verwendung von
lseek() auf einem
Terminal-Gerät mit dem Fehler
ESPIPE fehl.
dup(2),
fallocate(2),
fork(2),
open(2),
fseek(3),
lseek64(3),
posix_fallocate(3)
Die deutsche Übersetzung dieser Handbuchseite wurde von Peter Gerbrandt
<
[email protected]>, Martin Eberhard Schauer
<
[email protected]>, Mario Blättermann
<
[email protected]> und Helge Kreutzmann
<
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer