As interfaces típicas de chamada do sistema permitem reduzir o tamanho de um arquivo (sem substituí-lo por um inode diferente)?

As interfaces típicas de chamada do sistema permitem reduzir o tamanho de um arquivo (sem substituí-lo por um inode diferente)?

Existe uma maneira de open()fazer com que um arquivo diminua? Pode-se, é claro, abri-los em modo de acréscimo ou procurar até o fim e escrever para fazê-los crescer. No entanto, até onde eu sei, não existe um método para reduzir um arquivo por meio de interfaces típicas de chamada de sistema no estilo Unix.

A única maneira de fazer isso, até onde eu sei, é fingir, criando um novo arquivo mais curto e rename()substituindo-o pelo antigo.

Eu só queria uma confirmação, porque vi uma resposta que implicava que era possível fazer editores de arquivos que funcionassem diretamente em um arquivo, em vez de passar pelo processo de criar um novo e renomeá-lo.

Sempre pensei que a API de arquivos nas interfaces de chamada de sistema no estilo libc e unix não permitia a redução de arquivos para facilitar a implementação de sistemas de arquivos e talvez evitar padrões de uso que possam contribuir para a fragmentação.

Responder1

man -s 2 ftruncatediz

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 dizendo que se você usar ftruncate você deve ter aberto o arquivo para gravação, e se você usar truncate o arquivo deve ser gravável.

Responder2

Oopen(2)a chamada do sistema aceita o O_TRUNCsinalizador que pode reduzir o tamanho do arquivo:

O_TRUNC– Se o arquivo existir e for um arquivo normal e for aberto com sucesso O_RDWRou O_WRONLY, seu comprimento será truncado para 0 e o modo e o proprietário permanecerão inalterados. Não terá efeito sobre arquivos especiais FIFO ou arquivos de dispositivos terminais. Seu efeito em outros tipos de arquivo é definido pela implementação. O resultado do uso O_TRUNCsem O_RDWRou O_WRONLYé indefinido.

É freqüentemente usado quando o programa pretende substituir totalmente o conteúdo de um arquivo. Um exemplo é o operador de redirecionamento de arquivos do seu shell, como em command > file.

informação relacionada