Una de las cosas que me ha intrigado desde que comencé a usar Linux es el hecho de que le permite cambiar el nombre de un archivo o incluso eliminarlo mientras se está leyendo. Un ejemplo es cómo accidentalmente intenté eliminar un video mientras se estaba reproduciendo. Tuve éxito y me sorprendí al saber que puedes cambiar casi cualquier cosa en un archivo sin importar si se está utilizando en este momento o no.
operating-systems
file-management
the_midget_17
fuente
fuente
/proc
sistema de archivos a través del programa que lo tiene abierto). Un archivo solo se puede eliminar realmente si no le quedan referencias, y esto sucede automáticamente.Respuestas:
Cada vez que abre o ejecuta un archivo en Windows, Windows bloquea el archivo en su lugar (esto es una simplificación, pero generalmente es cierto). Un archivo que está bloqueado por un proceso no se puede eliminar hasta que ese proceso lo libere. Es por eso que cada vez que Windows tiene que actualizarse necesita un reinicio para que surta efecto.
Por otro lado, los sistemas operativos tipo Unix como Linux y Mac OS X no bloquean el archivo sino los sectores de disco subyacentes. Esto puede parecer una diferenciación trivial, pero significa que el registro del archivo en la tabla de contenido del sistema de archivos se puede eliminar sin perturbar ningún programa que ya tenga el archivo abierto. Por lo tanto, puede eliminar un archivo mientras aún se está ejecutando o de otro modo en uso y continuará existiendo en el disco siempre que algún proceso tenga un identificador abierto aunque su entrada en la tabla de archivos haya desaparecido.
fuente
Windows por defecto es el bloqueo automático y obligatorio de archivos. UNIX establece de forma predeterminada el bloqueo manual y cooperativo de archivos. En ambos casos, los valores predeterminados pueden ser anulados, pero en ambos casos generalmente no lo son.
Una gran cantidad de código antiguo de Windows utiliza la API C / C ++ (funciones similares
fopen
) en lugar de la API nativa (funciones similaresCreateFile
). La API de C / C ++ no le da forma de especificar cómo funcionará el bloqueo obligatorio, por lo que obtiene los valores predeterminados. El "modo compartido" predeterminado tiende a prohibir operaciones "en conflicto". Si abre un archivo para escribir, se supone que las escrituras entran en conflicto, incluso si nunca escribe realmente en el archivo. Lo mismo ocurre con los cambios de nombre.Y, aquí es donde empeora. Además de abrir para lectura o escritura, la API de C / C ++ no proporciona ninguna forma de especificar qué piensa hacer con el archivo. Por lo tanto, la API debe asumir que va a realizar cualquier operación legal. Dado que el bloqueo es obligatorio, se rechazará el
open
que permite una operación en conflicto, incluso si el código nunca tuvo la intención de realizar la operación en conflicto, sino que simplemente estaba abriendo el archivo para otro propósito.Entonces, si el código usa la API C / C ++, o usa la API nativa sin pensar específicamente en estos problemas, terminarán impidiendo el conjunto máximo de operaciones posibles para cada archivo que abran y no podrán abrir un archivo a menos que cada operación posible podría funcionar en él una vez abierto no está en conflicto.
En mi opinión, el método de Windows funcionaría mucho mejor que el método de UNIX si cada programa eligiera sus modos de compartir y los modos abiertos sabiamente y manejara de manera sensata los casos de falla. Sin embargo, el método UNIX funciona mejor si el código no se molesta en pensar en estos problemas. Desafortunadamente, la API básica de C / C ++ no se correlaciona bien con la API de archivos de Windows de una manera que maneja los modos de compartir y los conflictos se abren bien. Entonces el resultado neto es un poco desordenado.
fuente
Esta es una pregunta muy interesante y me ha hecho pensar en una respuesta viable. Espero que otros puedan proporcionar respaldo aquí.
Utilizo Windows y Linux y noté esto también. También soy un usuario de vim. Vim leerá un archivo de texto en un "búfer", o la RAM, y luego no tocará el archivo real hasta que lo guarde. Linux podría estar realizando este tipo de acción en general con todos los archivos.
Tome su video, por ejemplo, lee el video, todo si es posible, en la RAM, y luego tiene una copia del video que es fácilmente accesible, buscable, saltable. Si el archivo es demasiado grande, es posible que experimente problemas porque Linux podría no leer todo el video, tal vez solo una gran parte. Cuando su reproductor llegue al final del video almacenado, intentará leer el archivo nuevamente. Si ha eliminado el video, eso es una mierda para usted.
Windows es un sistema operativo mucho más "seguro" en algunos casos porque no le permitirá hacerlo. Puede almacenar en búfer los archivos de la misma manera que Linux, pero también agrega bloqueo de archivos para evitar que usted u otros programas alteren los archivos en los que está trabajando o viendo. Esto ayuda a mantener el archivo intacto y evita que usted u otros programas sobrescriban los cambios de cada uno.
fuente