Cuando eliminas un archivo, realmente eliminas un enlace al archivo (al inodo). Si alguien ya tiene ese archivo abierto, puede conservar el descriptor de archivo que tiene. El archivo permanece en el disco, ocupando espacio, y puede escribirse y leerse si tiene acceso a él.
La unlink
función se define con este comportamiento por POSIX:
Cuando el recuento de enlaces del archivo se convierte en 0 y ningún proceso tiene el archivo abierto, el espacio ocupado por el archivo se liberará y el archivo ya no será accesible. Si uno o más procesos tienen el archivo abierto cuando se elimina el último enlace, el enlace se eliminará antes de que unlink () regrese, pero la eliminación del contenido del archivo se pospondrá hasta que se cierren todas las referencias al archivo .
Este consejo debido a ese comportamiento. El daemon tendrá el archivo abierto y no notará que se ha eliminado (a menos que lo esté monitoreando específicamente, lo cual es poco común). Seguirá escribiendo alegremente en el descriptor de archivo existente que tiene: seguirá ocupando (más) espacio en el disco, pero no podrá ver ninguno de los mensajes que escribe, por lo que realmente está en el peor de ambos mundos. Si trunca el archivo a una longitud cero, entonces el espacio se libera inmediatamente, y cualquier mensaje nuevo se agregará en el nuevo final del archivo donde puede verlos.
Eventualmente, cuando el demonio termina o close
envía el archivo , el espacio se liberará. Nadie nuevo puede abrir el archivo mientras tanto (excepto a través de interfaces reflectantes específicas del sistema como las de Linux/proc/x/fd/...
). También se garantiza que:
Si el recuento de enlaces del archivo es 0, cuando todos los descriptores de archivo asociados con el archivo están cerrados, el espacio ocupado por el archivo se liberará y el archivo ya no será accesible.
Por lo tanto, no pierde el espacio en el disco de forma permanente, pero no gana nada al eliminar el archivo y pierde el acceso a los mensajes nuevos.
/proc/x/fd/y
? ¿Causaría eso que el proceso no pueda escribir en el descriptor de archivo, o es una operación ilegal?