ftruncate(2) eine Datei auf eine bestimmte Länge verkürzen

Other Alias

truncate

ÜBERSICHT

#include <unistd.h>
#include <sys/types.h>

int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);

Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

Für truncate():

_XOPEN_SOURCE >= 500

    || /* Seit Glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
    || /* Glibc-Versionen <= 2.19: */ _BSD_SOURCE

Für ftruncate():

_XOPEN_SOURCE >= 500
    || /* Seit Glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
    || /* Glibc-Versionen <= 2.19: */ _BSD_SOURCE

BESCHREIBUNG

Die Funktionen truncate() und ftruncate() bewirken, dass die reguläre Datei, die durch path oder fd angegeben ist, auf eine Größe von exakt length Byte verkürzt wird.

Falls die Datei vorher größer war, geht ein Teil der Daten verloren. Falls die Datei vorher kleiner war, wird sie vergrößert und der zusätzliche Teil wird als Null-Bytes ('\0') gelesen.

Der Datei-Offset wird nicht geändert.

Wenn die Größe geändert wurde, werden die Felder st_ctime und st_mtime (die Zeit der letzten Zustandsänderung und die Zeit der Modifikation; siehe stat(2)) für die Datei aktualisiert; die Modus-Bits Set-User-ID und Set-Group-ID können gelöscht werden.

Für ftruncate() muss die Datei zum Schreiben geöffnet sein, für truncate() muss die Datei schreibbar sein.

RÜCKGABEWERT

Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER

Für truncate():
EACCES
Eine Komponente des Pfad-Präfix darf nicht durchsucht werden oder die benannte Datei kann vom Benutzer nicht geschrieben werden (siehe auch path_resolution(7).)
EFAULT
Das Argument path zeigt aus dem dem Prozess zugewiesenen Adressraum heraus.
EFBIG
Das Argument length ist größer als die maximale Dateigröße. (XSI)
EINTR
Der Aufruf wurde von einem Signal-Handler unterbrochen, während er auf den Abschluss wartete (siehe fcntl(2) und signal(7)).
EINVAL
Das Argument length ist negativ oder größer als die maximale Dateigröße.
EIO
Bei der Aktualisierung des Inodes trat ein E/A-Fehler auf.
EISDIR
Die angegebene Datei ist ein Verzeichnis.
ELOOP
Beim Übersetzen des Pfadnamens wurden zu viele symbolische Links vorgefunden.
ENAMETOOLONG
Ein Teil eines Pfades ist größer als 255 Zeichen oder ein kompletter Pfadname überschreitet eine Größe von 1023 Zeichen.
ENOENT
Die angegebene Datei existiert nicht.
ENOTDIR
Eine Komponente des Pfad-Präfixes ist kein Verzeichnis.
EPERM
Das unterliegende Dateisystem erlaubt keine Vergrößerung der Datei über ihre aktuelle Größe hinaus.
EPERM
The operation was prevented by a file seal; see fcntl(2).
EROFS
Die angegebene Datei befindet sich auf einem nur lesbaren (read-only) Dateisystem.
ETXTBSY
The file is an executable file that is being executed.

Für ftruncate() gelten die gleichen Fehlermeldungen. Anstelle von Dingen, die mit path schieflaufen können, gibt es jetzt Dinge, die mit dem Dateideskriptor fd schiefgehen können:

EBADF
fd ist kein zulässiger Dateideskriptor.
EBADF oder EINVAL
fd ist nicht zum Schreiben geöffnet.
EINVAL
fd referenziert keine reguläre Datei.
EINVAL oder EBADF
The file descriptor fd is not open for writing. POSIX permits, and portable applications should handle, either error for this case. (Linux produces EINVAL.)

KONFORM ZU

POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (diese Systemaufrufe traten zuerst in BSD 4.2 auf).

ANMERKUNGEN

Die BESCHREIBUNG oben ist für XSI-konforme Systeme gedacht. Für nicht XSI-konforme Systeme erlaubt der POSIX-Standard zweierlei Verhalten von ftruncate, wenn length größer ist als die Dateilänge (beachten Sie, dass truncate für eine derartige Umgebung nicht spezifiziert ist): entweder wird ein Fehler zurückgeliefert oder die Datei wird vergrößert. Wie die meisten Unix-Implementierungen folgt Linux der XSI-Forderung, wenn es sich mit nativen Dateisystemen befasst. Aber einige nicht native Dateisysteme gestatten die Verwendung von truncate() und ftruncate() nicht, um eine Datei über ihre aktuelle Größe hinweg zu erweitern. Ein namhaftes Beispiel für Linux ist VFAT.

Die ursprünglichen Linux-Systemaufrufe truncate() und ftruncate() wurden nicht entwickelt, um große Datei-Offsets zu behandeln. Folglich fügte Linux 2.4 die Systemaufrufe truncate64() und ftruncate64() für die Bearbeitung sehr großer Dateien hinzu. Allerdings können diese Details von Anwendungen ignoriert werden, welche die Glibc nutzen. Deren Wrapper-Funktionen verwenden die neueren Systemaufrufe transparent, wenn diese verfügbar sind.

Auf einigen 32-Bit-Architekturen unterscheidet sich die Aufrufsignatur dieser Systemaufrufe. Die Gründe sind in syscall(2) beschrieben.

FEHLER

Ein Fehler der Header-Dateien von Glibc 2.12 hatte zur Folge, dass der erforderliche Minimalwert von _POSIX_C_SOURCE zur Bereitstellung der Deklaration von ftruncate() 200809L war anstatt 200112L. Der Fehler ist in späteren Versionen der Glibc behoben.

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 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 https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Dennis Stampfer <[email protected]>, Helge Kreutzmann <[email protected]>, Martin Eberhard Schauer <[email protected]> und Mario Blättermann <[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 <[email protected]>.