lseek(2) System Calls Manual lseek(2) BEZEICHNUNG lseek - den Dateiversatz fur lesen/schreiben verandern BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include off_t lseek(int dd, off_t Versatz, int dorthin); BESCHREIBUNG lseek() setzt den Versatz der mit dem Dateideskriptor dd verbundenen offenen Dateideskription gemass 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 Dateigrosse plus Versatz byte gesetzt. lseek() erlaubt es, den Versatz einer Datei hinter ihr Dateiende zu setzen. (Das andert aber nicht die Grosse der Datei.) Wenn dort spater Daten geschrieben werden, geben Lesezugriffe auf die Lucke zwischen der eigentlichen Datei und den neuen Daten solange Nullbytes (>>\0<<) zuruck, bis tatsachlich Daten in die Lucke geschrieben werden. Suchen von Daten und Lucken in der Datei Seit Version 3.1 unterstutzt Linux die folgenden zusatzlichen Werte fur dorthin: SEEK_DATA Einstellen des Dateiversatzes auf die nachste Position in der Datei grosser oder gleich Versatz, die Daten enthalt. Falls Versatz auf Daten zeigt, wird der Datei-Versatz auf Versatz gesetzt. SEEK_HOLE Einstellen des Dateiversatzes auf die nachste Lucke in der Datei grosser oder gleich als Versatz. Falls Versatz in ein Loch zeigt, wird der Datei-Versatz auf Versatz gesetzt. Falls es hinter Versatz keine Lucke gibt, wird der Datei-Versatz auf das Dateiende eingestellt (d. h., am Ende jeder Datei gibt es ein implizites Loch). In beiden der obigen Falle schlagt lseek() fehl, wenn Versatz hinter das Dateiende weist. Diese Operationen ermoglichen Anwendungen, Locher in einer Datei mit verstreut zugewiesenem Speicherplatz (sparsely allocated file) abzubilden. Dies kann nutzlich sein fur Anwendungen wie Werkzeuge fur Datei-Backups, die beim Erstellen von Backups Platz sparen und Locher erhalten konnen, wenn sie uber einen Mechanismus fur die Erkennung von Lochern verfugen. Fur 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 Locher zu berichten, sodass diese Operationen kein sicherer Mechanismus zum Abbilden des tatsachlich einer Datei zugeordneten Speicherplatzes sind. (Daruber hinaus wird eine Reihe von Nullen, die tatsachlich an den zugrunde liegenden Speicher geschrieben wurde, nicht als ein Loch gemeldet werden.) In der einfachsten Implementierung kann ein Dateisystem die Operationen unterstutzen, indem SEEK_HOLE immer den Versatz des Dateiendes und SEEK_DATA immer den Versatz zuruck 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 beziehen zu konnen. Die Operationen SEEK_HOLE und SEEK_DATA werden von den folgenden Dateisystemen unterstutzt: o Btrfs (seit Linux 3.1) o OCFS (seit Linux 3.2) o XFS (seit Linux 3.5) o Ext4 (seit Linux 3.8) o tmpfs(5) (seit Linux 3.8) o NFS (seit Linux 3.18) o FUSE (seit Linux 4.5) o GFS2 (seit Linux 4.15) RUCKGABEWERT Nach erfolgreicher Ausfuhrung gibt lseek() die neue Position in der Datei zuruck, gemessen in Bytes vom Anfang der Datei. Anderenfalls wird der Wert (off_t) -1 zuruckgegeben und errno gesetzt, um den den Fehler anzuzeigen. FEHLER EBADF dd ist kein Deskriptor fur eine geoffnete Datei. EINVAL dorthin ist ungultig. Oder: der resultierende Datei-Versatz ware negativ oder hinter dem Ende eines durchsuchbaren Gerats. 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 schlagt die Verwendung von lseek() auf einem Terminal-Gerat mit dem Fehler ESPIPE fehl. STANDARDS POSIX.1-2008. GESCHICHTE POSIX.1-2001, 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 nachste POSIX-Revision (Ausgabe 8) vorgeschlagen. ANMERKUNGEN In open(2) finden Sie Erlauterungen 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) unabhangig von der Verwendung von lseek() immer den Dateiversatz an das Ende der Datei. Manche Gerate unterstutzen kein Suchen und POSIX legt nicht fest, welche Gerate lseek() unterstutzen mussen. SIEHE AUCH dup(2), fallocate(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Peter Gerbrandt , Martin Eberhard Schauer , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 lseek(2)