No 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 ficariam fragmentados.)
Com 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.
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 da página de
fallocate(2)
manual:Os sistemas de arquivos podem não exigir que os arquivos sejam armazenados em uma área contínua (e isso seria muito 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 bastante mais complexos ou exigiria a movimentação de grandes quantidades de dados. Nenhum deles é realmente bom, e estruturas de dados complexas podem ser construídas no espaço do usuário em cima da API do sistema de arquivos.