¿Las interfaces típicas de llamadas al sistema permiten reducir el tamaño de un archivo (sin reemplazarlo con un inodo diferente)?

¿Las interfaces típicas de llamadas al sistema permiten reducir el tamaño de un archivo (sin reemplazarlo con un inodo diferente)?

¿Hay alguna manera de acceder a open()un archivo y hacer que se reduzca? Por supuesto, uno puede abrirlos en modo agregar o buscar hasta el final y escribir para que crezcan. Sin embargo, hasta donde yo sé, no existe ningún método para reducir un archivo a través de interfaces de llamadas al sistema típicas de estilo Unix.

La única forma de hacerlo, hasta donde yo sé, es falsificándolo creando un nuevo archivo más corto rename()en lugar del anterior.

Solo quería confirmación, porque vi una respuesta que implicaba que era posible crear editores de archivos que funcionaran directamente en un archivo en lugar de pasar por el proceso de crear uno nuevo y cambiarle el nombre en su lugar.

Siempre he pensado que la API de archivos en libc y las interfaces de llamadas al sistema de estilo Unix no permitían la reducción de archivos para facilitar la implementación de los sistemas de archivos y tal vez evitar patrones de uso que pudieran contribuir a la fragmentación.

Respuesta1

man -s 2 ftruncatedice

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

continúa diciendo que si usa ftruncate debe haber abierto el archivo para escribirlo, y si usa truncate, el archivo debe poder escribirse.

Respuesta2

Elopen(2)La llamada al sistema acepta la O_TRUNCbandera que puede reducir el tamaño del archivo:

O_TRUNC– Si el archivo existe y es un archivo normal y se abre correctamente O_RDWRo O_WRONLY, su longitud se truncará a 0 y el modo y el propietario no se modificarán. No tendrá ningún efecto sobre archivos especiales FIFO o archivos de dispositivos terminales. Su efecto sobre otros tipos de archivos está definido por la implementación. El resultado de usar O_TRUNCsin O_RDWRo O_WRONLYno está definido.

Se utiliza con frecuencia cuando el programa pretende sobrescribir por completo el contenido de un archivo. Un ejemplo es el operador de redirección de archivos de su shell como en command > file.

información relacionada