Para meu entendimento, para manipular arquivos, existe apenas o sys_write syscall no Linux, que sobrescreve o conteúdo do arquivo (ou o estende, se no final).
Por que não há syscalls para inserir ou excluir conteúdo em arquivos no Linux?
Como todos os sistemas de arquivos atuais não exigem que o arquivo seja armazenado em um bloco de memória contínuo, uma implementação eficiente deve ser possível. (Os arquivos seriam fragmentados.)
Com os recursos do sistema de arquivos como "copiar na gravação" ou "compactação transparente de arquivos", a maneira atual de inserir conteúdo parece ser muito ineficiente.
files
file-copy
system-calls
dercolamann
fonte
fonte
Respostas:
Em sistemas Linux recentes isso é realmente possível, mas com bloco (4096 na maioria das vezes), não granularidade de bytes e apenas em alguns sistemas de arquivos (ext4 e xfs).
Citando a partir da página de
fallocate(2)
manual:fonte
Os sistemas de arquivos podem não exigir que os arquivos sejam armazenados em uma área contínua (e isso seria bastante inflexível), mas geralmente os arquivos são armazenados em blocos de tamanho fixo (ou sequências de blocos contíguos). Fazer isso dessa maneira simplifica a implementação, e os blocos geralmente são múltiplos do tamanho do bloco do dispositivo subjacente.
Portanto, implementar inserções de blocos com comprimento arbitrário tornaria o formato e a implementação do sistema de arquivos mais complexo ou exigiria a movimentação de grandes quantidades de dados. Nenhuma dessas opções é realmente boa e estruturas de dados complexas podem ser construídas no espaço do usuário na parte superior da API do sistema de arquivos.
fonte