El bloqueo de archivos, o el bloqueo en general, es solo una de las diversas soluciones propuestas para abordar los problemas asociados con el uso compartido de recursos.
El bloqueo de archivos es un método para preservar la seguridad e integridad de cualquier documento. El motivo principal del bloqueo de archivos es permitir que las personas realicen cambios en el documento sin crear un desorden. Cuando dos o más usuarios intentan cambiar un archivo, pueden surgir conflictos.
Por ejemplo, consideremos un archivo que contiene los datos de un proyecto. Todo el equipo del proyecto puede modificar el archivo. Habrá un script CGI codificado en la web para hacer lo siguiente.
$file = "project.docx"; $commit = $ENV{'QUERY_INFO'}; open(FILE, "$file"); #opening the document while() { if (m/^$commit$/) { print "Change already made\n"; exit; } } close(FILE); push(@newcommit, $commit); open(FILE, ">$file"); print ... close(FILE); print "Commit made!"; exit;
El bloqueo de un archivo se realiza a nivel del sistema, lo que significa que los detalles reales de la aplicación del bloqueo no son algo de lo que el usuario deba preocuparse. Los bloqueos de archivos se introducen para establecer restricciones temporales en ciertos archivos para limitar cómo se pueden compartir entre diferentes procesos. Dependiendo de la naturaleza de una operación, encontramos dos tipos de bloqueos. El primer tipo es un bloqueo compartido y el otro es un bloqueo exclusivo. Con respecto a los archivos, varios procesos pueden compartir el acceso de lectura porque el acceso de lectura no genera ningún cambio en el estado del recurso compartido. Por lo tanto, se puede mantener una vista coherente del recurso compartido.
El bloqueo de archivos se puede hacer, en Perl, con el comando flock .
flock()
acepta dos parámetros. El primero es el identificador de archivo. El segundo argumento indica la operación de bloqueo requerida.
Sintaxis :
rebaño [IDENTIFICADOR DE ARCHIVO], [OPERACIÓN]
Aquí, OPERACIÓN es un valor numérico, puede ser 1 , 2 , 4 u 8 .
Estos valores numéricos tienen diferente significado y se utilizan para realizar distintas operaciones como:
- BLOQUEAR_SH
- BLOQUEO_EX
- LOCK_NB
- LOCK_UN
Perl usa números para representar los valores:
sub LOCK_SH { 1 } ## establecer como bloqueo compartido
sub LOCK_EX { 2 } ## establecer como bloqueo exclusivo
sub LOCK_NB { 4 } ## establecer bloqueo sin ningún bloque
sub LOCK_UN { 8 } ## desbloquear el FILEHANDLE
- BLOQUEO COMPARTIDO:
se puede aplicar un bloqueo compartido cuando simplemente desea leer el archivo, así como permitir que otros lean el mismo archivo al mismo tiempo. Shared Lock no solo establece un bloqueo, sino que comprueba primero la existencia de otros bloqueos. Este Bloqueo no cubre la verificación de existencia para todos los bloqueos, sino solo para el ‘Bloqueo Exclusivo’. Si existe un bloqueo exclusivo, espera hasta que se elimine el bloqueo. Después de la eliminación, se ejecutará como bloqueo compartido. Puede que existan varios candados compartidos al mismo tiempo.Sintaxis :
rebaño(ARCHIVO, 1); # del código anterior
- BLOQUEO EXCLUSIVO
Se usa un bloqueo exclusivo cuando el archivo se va a usar entre un grupo de personas, y todos tienen permiso para hacer un cambio. Solo habrá un bloqueo exclusivo en un archivo para que solo un usuario/proceso a la vez realice cambios. En un bloqueo exclusivo, la regla es «Soy el único». flock() busca cualquier otro tipo de bloqueo en el script. Si se encuentra, se mantendrá hasta que se eliminen todos del script. En el momento adecuado, bloqueará el archivo.Sintaxis :
rebaño(ARCHIVO, 2); # del código anterior
- BLOQUEO SIN BLOQUEO
Un bloqueo sin bloqueo informa al sistema que no debe esperar a que se eliminen otros bloqueos del archivo. Devolverá un mensaje de error si se encuentra otro bloqueo en el archivo.Sintaxis :
rebaño(ARCHIVO, 4); # del código anterior
- DESBLOQUEO
Desbloquee cualquier archivo especificado, igual que lo hace la función cerrar (ARCHIVO).Sintaxis :
rebaño(ARCHIVO, 8); # del código anterior
A continuación se trata un problema que explica el uso de la función flock() :
Problema:
El principal problema con el script explicado en el ejemplo anterior es cuando abre el archivo – project.docx , limpiando el primer archivo y dejándolo vacío.
Imagine a la persona A, B, C tratando de realizar una confirmación casi al mismo tiempo.
La persona A abre el archivo para comprobar los datos. Lo cierra y comienza a editar los datos. (borrando el primer archivo)
Mientras tanto, la Persona B abre el archivo para verificar/leer y nota que está completamente vacío.
¡Eso es un Choque! Todo el sistema se verá afectado.
Solución:
aquí es donde se utiliza el bloqueo de archivos . Las personas A, B, C están dispuestas a comprometerse con el documento. La persona A abre el archivo, en ese momento (se activa el bloqueo compartido), verifica todos los datos dentro del archivo y lo vuelve a cerrar (desbloqueando el archivo).
Luego, la persona A desea confirmar cambios en el archivo y vuelve a abrir el archivo para realizar ediciones (aquí es cuando entra en acción el bloqueo exclusivo). Mientras la persona A realiza un cambio en el archivo, ni la persona B ni la C pueden abrir el archivo para leerlo o escribirlo.
La persona A hace su trabajo, cierra el archivo (desbloqueándolo).
Ahora bien, si la Persona B hubiera intentado abrir el archivo mientras tanto, habría recibido un error: «Algún otro candidato ha accedido al archivo».
Por lo tanto, no se crea ningún paso de los dedos de los pies y se mantiene un buen flujo de trabajo.
lockf()
La función se usa para bloquear partes de un archivo a diferencia de flock() que bloquea archivos completos a la vez. lockf() no se puede usar en Perl directamente, mientras que Perl admite la llamada al sistema de rebaño de forma nativa, pero no se aplica a los bloqueos de red. Perl también es compatible con la llamada al sistema fcntl() , que ofrece la mayor cantidad de controles de bloqueo en Perl.