Le interfacce di chiamata di sistema tipiche consentono di ridurre le dimensioni di un file (senza sostituirlo con un inode diverso)?


9

C'è un modo per open()un file e farlo restringere? Naturalmente, è possibile aprirli in append-mode o cercare fino alla fine e scrivere per farli crescere. Tuttavia, per quanto ne so, non esiste un metodo per ridurre un file tramite le tipiche interfacce di chiamata di sistema in stile unix.

L'unico modo per farlo, per quanto ne so, è falsificarlo creando un nuovo file più corto e rename()al posto di quello più vecchio.

Volevo solo una conferma, perché ho visto una risposta che implicava che era possibile creare editor di file che funzionavano direttamente su un file invece di passare attraverso il processo di creazione di uno nuovo e rinominarlo in atto.

Ho sempre pensato che l'API di file nelle interfacce di chiamata di sistema in stile libc e unix non consentisse la riduzione dei file per facilitare l'implementazione dei filesystem e forse evitare schemi di utilizzo che potrebbero contribuire alla frammentazione.


2
Basta aprire un file con fopenin modalità "w" (o "w +") per troncarlo automaticamente a lunghezza zero. O intendi ridurre a una dimensione diversa da zero, per preservare alcuni dei vecchi contenuti?
Wyzard,

4
Cordiali saluti, open()e openat()ho già un flag per il troncamento, O_TRUNCquindi tecnicamente provoca la riduzione del file, ovvero la riduzione completa, senza cambiare l'inode. L'esempio più famoso è quello in command > file.txtcui il file verrà troncato se esiste. Se corri strace, bash -c 'true > /dev/null'vedrai openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)nell'output. Naturalmente per dimensioni variabili del troncamento è necessario truncate()syscall. Fammi sapere se vuoi questo come una risposta effettiva invece del commento.
Sergiy Kolodyazhnyy il

@SergiyKolodyazhnyy Stavo pensando di ridursi a una dimensione arbitraria. Ho votato a favore della risposta di David Foerster perché risponde a un sottoinsieme della domanda, ma non la accetto alla luce di Icaro. Lo avrei preso come una risposta di tipo sì-e-no, mentre la risposta di Icarus ha già mostrato che la vera risposta è un "sì".
JoL

Risposte:


22

man -s 2 ftruncate dice

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

continua dicendo che se usi ftruncate devi aver aperto il file per la scrittura, e se usi truncate il file deve essere scrivibile.


L'aggiunta a un file fa sì che il sistema operativo lo accetti prima truncateper le nuove dimensioni del file, quindi write . Quindi truncateè la chiamata di sistema che stai cercando.
Margarciaisaia,

1
Su Linux, vedi anchefallocate(FALLOC_FL_COLLAPSE_RANGE)
Stéphane Chazelas il

2

La open(2)chiamata di sistema accetta il O_TRUNCflag che può ridurre la dimensione del file:

O_TRUNC- Se il file esiste ed è un file normale e il file viene aperto correttamente O_RDWRo O_WRONLY, la sua lunghezza deve essere troncata a 0 e la modalità e il proprietario rimangono invariati. Non ha alcun effetto sui file speciali FIFO o sui file dei dispositivi terminali. Il suo effetto su altri tipi di file è definito dall'implementazione. Il risultato dell'uso O_TRUNCsenza uno O_RDWRo O_WRONLYnon è definito.

Viene spesso utilizzato quando il programma mira a sovrascrivere interamente il contenuto di un file. Un esempio è l'operatore di reindirizzamento dei file della shell come in command > file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.