Lectura de archivo durante escritura en Linux

9

Según tengo entendido, cuando se escribe un archivo, el proceso de escritura en el archivo obtiene un bloqueo exclusivo. Por lo tanto, otros procesos no pueden acceder a este archivo para leerlo.

Con el conocimiento anterior, no puedo entender cómo puedo reproducir un video en un reproductor multimedia cuando el navegador todavía lo está descargando.

Clasificador
fuente
1
Por favor, especifique el motivo de la votación negativa. Gracias.
Seleccionador
2
Esto depende de la plataforma, por lo tanto, especifique el sistema operativo que está preguntando. Sé que Linux no proporciona bloqueos implícitos, pero Windows puede ser diferente.
amon
Estoy usando Linux
Sorter

Respuestas:

13

Tu comprensión está mal. Varios procesos de Linux pueden escribir en el mismo archivo a la vez (y lo que sucede puede no estar especificado, excepto cuando los procesos sobrescriben diferentes segmentos de ese archivo). Y algún otro proceso de Linux (por ejemplo, su navegador) puede leer un archivo en el que está escrito .

Podrías adoptar una convención para evitar eso . Por ejemplo, podría usar el bloqueo de archivos de aviso (adoptando la convención de que todo programa relevante debería hacer eso), por ejemplo, con flock (2) , lockf (3) , etc. Pero eso no prohibirá otros procesos (no seguir sus convenciones) para acceder (o incluso escribir) a ese archivo. Puede usar maquinaria de permisos (por ejemplo, dedicando un usuario del sistema a su programa setuid ).

Consulte también las respuestas this & that en StackOverflow (algunas de ellas mencionaron los mecanismos de bloqueo obligatorios obsoletos específicos de Linux). Lea sobre las propiedades de ACID , considere usar alguna base de datos ( sqlite , PostGreSQL , MongoDB , etc.) o algún archivo indexado ( gdbm ).

No conozco Windows, pero escuché el rumor de que no permite el acceso concurrente o escribe en el mismo archivo.

Basile Starynkevitch
fuente
4

Los archivos generalmente no están bloqueados: bloqueo de archivos Unix . También es bastante común tener múltiples lectores de archivos pero solo un escritor. Los problemas solo ocurren cuando tendrías múltiples escritores.

Además, la mayoría de los formatos de archivos de videos (y especialmente en la web) son transmisibles, lo que significa que no es necesario tener todo el video para reproducirlo.

mate
fuente
Pueden surgir problemas si cuenta con que el contenido de un archivo no cambie entre lecturas, por ejemplo, al intentar evitar cargar archivos grandes en la memoria.
yyny
2

Los sistemas operativos Unix no utilizan el bloqueo obligatorio (Gnu / Linux es Unix, otros ejemplos son UNIX, BSD, Mac OSX). Bloqueo evitado siempre que sea posible.

Algunos otros sistemas operativos utilizan el bloqueo obligatorio todo el tiempo (especialmente el sistema operativo Windows de Microsoft). Esto dejará de jugar hasta que esté completamente descargado, también le impedirá cambiar el nombre de un archivo o directorio que esté abierto (en el que se encuentra una aplicación). Pero en Unix está bien. Si una aplicación necesita bloqueo, puede usarla. Pero normalmente no.

ctrl-alt-delor
fuente
También puede optar por no bloquear archivos en Windows. Reproduzco videos medio descargados todo el tiempo. El bloqueo solo es necesario para los ejecutables cargados.
CodesInChaos
@CodesInChaos Demasiado cierto, pero la mayoría de las aplicaciones se bloquean, ¿sabe si puede acceder a un directorio sin bloqueo? También estoy pensando, ¿cómo funcionan los ejecutables en Linux sin bloqueo?
ctrl-alt-delor
1
Creo que la gran diferencia entre Linux y Windows es que Linux trata el archivo como separado de la entrada del sistema de archivos. Por lo tanto, puede desvincular un nombre de archivo mientras está abierto. Windows, por otro lado, retrasa la eliminación hasta que se cierra. ¿Linux permite la modificación de la ejecución de archivos ejecutables? ¿O simplemente permite la eliminación + recreación con contenido diferente?
CodesInChaos
@CodesInChaos Ambos, supongo, me preguntaba qué pasaría si lo modificaras, no lo borraras y crearas. Supongo que cuando se carga una aplicación, el sistema operativo abre el archivo en modo COW (Copiar al escribir), si algún proceso cambia el contenido, el sistema operativo hará una copia (de los bloques modificados). Una copia está vinculada a los procesos, la otra al archivo. Cuando se cierran todos los procesos que utilizan el original, la copia original se elimina (como no hay entrada en el sistema de archivos). Esto es solo una suposición, basado en lo que sé que el sistema operativo puede hacer.
ctrl-alt-delor