Existe uma maneira de open()um arquivo e fazer com que ele encolha? Pode-se, é claro, abri-los no 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 de chamada de sistema típicas no estilo unix.
A única maneira de fazê-lo, até onde eu sei, é falsificá-lo criando um novo arquivo menor e rename()no lugar do antigo.
Eu só queria confirmação, porque vi uma resposta que implicava que era possível criar editores de arquivos que funcionassem diretamente em um arquivo, em vez de passar pelo processo de criar um novo e renomeá-lo.
Eu sempre pensei que a API do arquivo nas interfaces de chamada de sistema libc e estilo unix não permitia o encolhimento 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.
open()e openat()já possui um sinalizador para truncar, O_TRUNCportanto , tecnicamente, o arquivo diminui - ou seja, diminui completamente - sem alterar o inode. O exemplo mais famoso disso é command > file.txtque o arquivo será truncado, se existir. Se você executar straceem bash -c 'true > /dev/null'que você verá openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)na saída. Obviamente, para tamanho variável de truncamento, você precisa do truncate()syscall. Deixe-me saber se você quer isso como uma resposta real em vez do comentário.
fopenno modo "w" (ou "w +") para truncá-lo no tamanho zero automaticamente. Ou você quer dizer encolher para um tamanho diferente de zero, para preservar parte do conteúdo antigo?