Si el archivo se mueve (en el mismo sistema de archivos) o se le cambia el nombre, el identificador del archivo permanece abierto y todavía se puede usar para leer y escribir el archivo.
Si se elimina el archivo, el identificador del archivo permanece abierto y aún se puede usar (esto no es lo que algunas personas esperan). El archivo no se eliminará realmente hasta que se cierre el último identificador.
Si el archivo se reemplaza por un nuevo archivo, depende exactamente de cómo. Si se sobrescribe el contenido del archivo, el identificador del archivo seguirá siendo válido y accederá al nuevo contenido. Si se desvincula el archivo existente y se crea uno nuevo con el mismo nombre o si se mueve un archivo nuevo al archivo existente usando rename()
, es lo mismo que la eliminación (ver arriba), es decir, el identificador del archivo seguirá haciendo referencia al original versión del archivo.
En general, una vez que el archivo está abierto, el archivo está abierto, y nadie que cambie la estructura del directorio puede cambiar eso:puede mover, cambiar el nombre del archivo o poner algo más en su lugar, simplemente permanece abierto.
En Unix no hay borrado, solo unlink()
, lo cual tiene sentido ya que no necesariamente elimina el archivo, solo elimina el enlace del directorio.
Si, por otro lado, el dispositivo subyacente desaparece (p. ej., desconexión de USB), el identificador de archivo ya no será válido y es probable que proporcione IO/error en cualquier operación. Sin embargo, todavía tienes que cerrarlo. Esto será cierto incluso si el dispositivo se vuelve a enchufar, ya que no es sensato mantener un archivo abierto en este caso.
Los identificadores de archivo apuntan a un inodo, no a una ruta, por lo que la mayoría de sus escenarios aún funcionan como supone, ya que el identificador aún apunta al archivo.
Específicamente, con el escenario de eliminación:la función se llama "desvincular" por una razón, destruye un "vínculo" entre un nombre de archivo (una entrada) y un archivo. Cuando abre un archivo y luego lo desvincula, el archivo todavía existe hasta que su recuento de referencias llega a cero, que es cuando cierra el identificador.
Editar: En el caso del hardware, ha abierto un controlador para un nodo de dispositivo específico, si desconecta el dispositivo, el kernel fallará en todos los accesos, incluso si el dispositivo vuelve. Deberá cerrar el dispositivo y volver a abrirlo.
No estoy seguro acerca de las otras operaciones, pero en cuanto a la eliminación:la eliminación simplemente no se lleva a cabo (físicamente, es decir, en el sistema de archivos) hasta que se cierra el último identificador abierto del archivo. Por lo tanto, no debería ser posible eliminar un archivo de su aplicación.
Algunas aplicaciones (que no vienen a la mente) se basan en este comportamiento, al crear, abrir y eliminar archivos de inmediato, que luego viven exactamente tanto como la aplicación, lo que permite que otras aplicaciones conozcan el ciclo de vida de la primera aplicación sin necesidad de hacerlo. mire los mapas de procesos y demás.
Es posible que se apliquen consideraciones similares a las otras cosas.