Ermöglichen typische Systemaufrufschnittstellen die Reduzierung der Dateigröße (ohne sie durch einen anderen Inode zu ersetzen)?

Ermöglichen typische Systemaufrufschnittstellen die Reduzierung der Dateigröße (ohne sie durch einen anderen Inode zu ersetzen)?

Gibt es eine Möglichkeit, open()eine Datei zu verkleinern? Man kann sie natürlich im Anfügemodus öffnen oder bis zum Ende suchen und schreiben, um sie zu vergrößern. Soweit ich weiß, gibt es jedoch keine Methode, eine Datei über typische Systemaufrufschnittstellen im Unix-Stil zu verkleinern.

Die einzige Möglichkeit, dies zu tun, besteht meines Wissens darin, es vorzutäuschen, indem man eine neue, kürzere Datei erstellt und rename()diese an die Stelle der alten setzt.

Ich wollte nur eine Bestätigung, weil ich eine Antwort gesehen habe, die implizierte, dass es möglich sei, Dateieditoren zu erstellen, die direkt mit einer Datei arbeiten, anstatt eine neue Datei zu erstellen und sie an Ort und Stelle umzubenennen.

Ich habe immer gedacht, dass die Datei-API in libc- und unixartigen Systemaufrufschnittstellen keine Verkleinerung von Dateien ermöglicht, um die Implementierung von Dateisystemen zu vereinfachen und möglicherweise Nutzungsmuster zu vermeiden, die zur Fragmentierung beitragen könnten.

Antwort1

man -s 2 ftruncatesagt

DESCRIPTION
   The  truncate()  and  ftruncate()  functions cause the regular file
   named by path or referenced by fd to be truncated to a size of precisely
   length bytes.

...

CONFORMING TO
   POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).

Weiter heißt es, dass Sie die Datei zum Schreiben geöffnet haben müssen, wenn Sie ftruncate verwenden, und dass die Datei beschreibbar sein muss, wenn Sie truncate verwenden.

Antwort2

Deropen(2)Der Systemaufruf akzeptiert das O_TRUNCFlag, mit dem die Dateigröße reduziert werden kann:

O_TRUNC– Wenn die Datei existiert und eine normale Datei ist und die Datei erfolgreich geöffnet wurde O_RDWRoder O_WRONLY, wird ihre Länge auf 0 gekürzt und der Modus und der Besitzer bleiben unverändert. Dies hat keine Auswirkungen auf FIFO-Spezialdateien oder Terminalgerätedateien. Die Auswirkungen auf andere Dateitypen sind implementierungsdefiniert. Das Ergebnis der Verwendung O_TRUNCohne O_RDWRoder O_WRONLYist undefiniert.

Es wird häufig verwendet, wenn das Programm den Inhalt einer Datei vollständig überschreiben möchte. Ein Beispiel ist der Dateiumleitungsoperator Ihrer Shell wie in command > file.

verwandte Informationen