Lo que está sucediendo es bastante simple: es vaciar el archivo.
¿Por qué está lleno de ^@
s, entonces, usted pregunta? Bueno, en un sentido muy real, no lo es. No contiene esos personajes extraños. Tiene un "agujero".
El programa que está escribiendo en el archivo está escribiendo un archivo que se abrió con O_WRONLY
(o tal vez O_RDWR
), pero no O_APPEND
. Este programa ha escrito, digamos, 65536 bytes en el archivo en el momento en que vacía el archivo con cp /dev/null filename
o : > filename
o algún comando similar.
Ahora el programa va a write
otro trozo de datos (digamos, 4096 u 8192 bytes). ¿Dónde se escribirán esos datos? La respuesta es: "en el desplazamiento de búsqueda actual en el descriptor de archivo subyacente". Si el programa usara O_APPEND
, el write
estaría, de hecho, precedido por una llamada lseek
que hizo una "búsqueda hasta el final actual del archivo, es decir, la longitud actual del archivo". Cuando trunca el archivo, "el final actual del archivo" se volvería cero (el archivo se volvería vacío) de modo que la búsqueda movería el desplazamiento write
a la posición 0 y la escritura iría allí. Pero el programa no usó O_APPEND
, por lo que no hay una operación de "reposición" previa a write
, y los bytes de datos se escriben en el desplazamiento actual (que, nuevamente, hemos afirmado que es 65536 anterior).
Ahora tiene un archivo que no tiene datos en desplazamientos de bytes 0 a 65535 inclusive, seguido de algunos datos en desplazamientos de bytes 65536 a través 73727 (suponiendo que el write
escribe 8192 bytes). Esa información "faltante" es el "agujero" en el archivo. Cuando algún otro programa va a leer el archivo, el sistema operativo pretende que es datos allí: datos de cero bytes.
Si el programa que realiza las operaciones write
no las hace en los límites de los bloques, el sistema operativo de hecho asignará algunos datos adicionales (para ajustar la escritura en bloques enteros) y lo pondrá a cero. Esos bytes cero no son parte del "agujero" (son cero bytes reales en el archivo), sino a los programas comunes que no se asoman detrás de la cortina en el Wizard of Oz, los "cero" bytes y el "no" "cero bytes" son indistinguibles.
Lo que necesita hacer es modificar el programa para usar O_APPEND
, o usar rutinas de biblioteca como syslog
que saben cómo cooperar con operaciones de rotación de registros, o tal vez ambas.
[Editar para agregar: no está seguro de por qué esto repente apareció en la primera página y me respondió una pregunta de 2,011 ...]
echo ""> nombre de archivo? –
¿Por qué escribe '@@@@' cuando realmente ve '^ @^@^@^@'? – glglgl
@gigigi post corregido –