Según tengo entendido, para manipular archivos solo hay sys_write syscall en Linux, que sobrescribe el contenido del archivo (o lo extiende, si al final).
¿Por qué no hay syscalls para insertar o eliminar contenido en archivos en Linux?
Como todos los sistemas de archivos actuales no requieren que el archivo se almacene en un bloque de memoria continuo, debería ser posible una implementación eficiente. (Los archivos se fragmentarían).
Con las características del sistema de archivos como "copiar al escribir" o "compresión transparente de archivos", la forma actual de insertar contenido parece ser muy ineficiente.
files
file-copy
system-calls
dercolamann
fuente
fuente
Respuestas:
En sistemas Linux recientes eso es realmente posible, pero con bloque (4096 la mayor parte del tiempo), no granularidad de bytes , y solo en algunos sistemas de archivos (ext4 y xfs).
Citando de la página de
fallocate(2)
manual:fuente
Es posible que los sistemas de archivos no requieran que los archivos se almacenen en un área continua (y eso sería muy inflexible), pero generalmente los archivos se almacenan en bloques de tamaño fijo (o secuencias de bloques contiguos). Hacerlo de esa manera simplifica la implementación, y los bloques suelen ser múltiplos del tamaño del bloque del dispositivo subyacente.
Por lo tanto, la implementación de insertos de bloques con una longitud arbitraria haría que el formato y la implementación del sistema de archivos sean bastante más complejos o que requiera mover cantidades potencialmente grandes de datos. Ninguno de los dos es realmente bueno, y se pueden construir estructuras de datos complejas en el espacio de usuario sobre la API del sistema de archivos.
fuente