GNU/Linux >> Tutoriales Linux >  >> Linux

Qué sucede con un identificador de archivo abierto en Linux si el archivo apuntado se mueve o elimina

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.


Linux
  1. Chrome en Linux:consulta el navegador para ver qué pestañas están abiertas.

  2. ¿Cuál es la ubicación correcta del archivo mysql.sock en Linux?

  3. ¿Cuál es el equivalente al comando de archivo de Linux para Windows?

  4. ¿Qué le sucede a un proceso de Linux multiproceso si recibe una señal?

  5. ¿Cuál es el comando para copiar, leer y eliminar archivos en Linux?

¿Qué es umask en Linux?

¿Qué es el Shell en Linux?

¿Qué es el archivo .bashrc en Linux?

Las 10 herramientas de navegación de archivos de código abierto para el sistema Linux

¿Qué sistemas de archivos en Linux almacenan la hora de creación?

¿Qué sucede cuando otro proceso modifica un archivo que está paginado al 100 % en la memoria caché de la página?