BEZEICHNUNG¶
lseek - den Datei-Offset für lesen/schreiben verändern
ÜBERSICHT¶
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int
whence );
BESCHREIBUNG¶
Die Funktion
lseek() setzt den Offset der mit dem Dateideskriptor
fd verbundenen offenen Datei auf
offset gemäß der
whence-Anweisung wie folgt:
- SEEK_SET
- Der Offset wird auf offset Byte gesetzt.
- SEEK_CUR
- Der Offset wird auf die aktuelle Position plus offset Byte
gesetzt.
- SEEK_END
- Der Offset wird auf die Dateigröße plus offset Byte
gesetzt.
Die Funktion
lseek() erlaubt es, den Offset 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 Null-Bytes (»\0«) zurück, bis tatsächlich
Daten in die Lücke geschrieben werden.
Suchen von Daten und Lücken in der Datei¶
Seit Version 3.1 unterstützt Linux die folgenden zusätzlichen
Werte für
whence:
- SEEK_DATA
- Einstellen des Datei-Offsets auf die nächste Position in der Datei
größer oder gleich offset, die Daten enthält.
Falls offset auf Daten zeigt, wird der Datei-Offset auf
offset gesetzt.
- SEEK_HOLE
- Einstellen des Datei-Offsets auf die nächste Lücke in der
Datei größer oder gleich als offset. Falls
offset in ein Loch zeigt, wird der Datei-Offset auf offset
gesetzt. Falls es hinter offset keine Lücke gibt, wird der
Datei-Offset 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
offset 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 Offset des
Dateiendes und
SEEK_DATA immer den
offset zurück geben
(d.h. selbst wenn
offset 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 (seit Linux 3.8)
RÜCKGABEWERT¶
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.
FEHLER¶
- EBADF
- fd ist kein Deskriptor für eine geöffnete Datei.
- EINVAL
- whence ist ungültig. Oder: der resultierende Datei-Offset
wäre negativ oder hinter dem Ende eines durchsuchbaren
Geräts.
- EOVERFLOW
- Der resultierende Datei-Offset kann nicht in einem off_t
dargestellt werden.
- ESPIPE
- fd beschreibt eine Pipe, einen Socket oder ein FIFO.
- ENXIO
- whence ist SEEK_DATA oder SEEK_HOLE und der aktuelle
Datei-Offset ist hinter dem Dateiende.
SVr4, 4.3BSD, POSIX.1-2001.
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.
ANMERKUNGEN¶
In
open(2) finden Sie Erläuterungen zu den Beziehungen zwischen
Dateideskriptoren, offenen Dateideskriptoren und Dateien.
Manche Geräte unterstützen kein Suchen und POSIX legt nicht fest,
welche Geräte
lseek() unterstützen müssen.
Unter Linux gibt die Verwendung von
lseek() auf einem
Terminal-Gerät
ESPIPE zurück.
Wenn alter Code konvertiert wird, ersetzen Sie die Werte von
whence durch
die folgenden Makros:
alt |
neu |
0 |
SEEK_SET |
1 |
SEEK_CUR |
2 |
SEEK_END |
L_SET |
SEEK_SET |
L_INCR |
SEEK_CUR |
L_XTND |
SEEK_END |
Beachten Sie, dass von
dup(2) oder
fork(2) erzeugte
Dateideskriptoren den gleichen Zeiger für die aktuelle Dateiposition
gemeinsam nutzen, so dass Suchoperationen in solchen Dateien
Wettlaufbedingungen (race conditions) unterliegen können.
SIEHE AUCH¶
dup(2),
fork(2),
open(2),
fseek(3),
lseek64(3),
posix_fallocate(3)
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.74 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler
gemeldet werden können sowie die aktuelle Version dieser Seite finden
sich unter
http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Peter Gerbrandt
<pgerbrandt@bfs.de>, Martin Eberhard Schauer
<Martin.E.Schauer@gmx.de>, Mario Blättermann
<mario.blaettermann@gmail.com> und Helge Kreutzmann
<debian@helgefjell.de> 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 <debian-l10n-german@lists.debian.org>.