lseek(2)

BEZEICHNUNG
lseek - den Dateiversatz für lesen/schreiben verändern

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <unistd.h>

off_t lseek(int dd, off_t Versatz, int dorthin);

BESCHREIBUNG
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.

  Suchen von Daten und Lücken in der Datei
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)

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
    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.

VERSIONEN
Unter Linux schlägt die Verwendung von lseek() auf einem Terminal-Gerät mit dem Fehler ESPIPE fehl.

STANDARDS
POSIX.1-2024.

GESCHICHTE
4.3BSD, SVr4, POSIX.1-1988.

SEEK_DATA
SEEK_HOLE
    Solaris 10, FreeBSD 7.0, DragonFly BSD 2.3.1, POSIX.1-2024.

ANMERKUNGEN
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.

Manche Geräte unterstützen kein Suchen und POSIX legt nicht fest, welche Geräte lseek() unterstützen müssen.

SIEHE AUCH
dup(2), fallocate(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3)

Ü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 (https://www.gnu.org/licenses/gpl-3.0.html) 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: debian-l10n-german@lists.debian.org.