Introducción
Perl tiene una función llamada flock() que sirve para "cerrar" los archivos mientras los estas utilizando. Esta función solo puede ser utilizada en UNIX debido a que no esta implementada en Windows.
¿Por qué es necesario?
Digamos que tienes un script que permite a las personas que navegan en tu sitio dejar un mensaje, y este mensaje lo escribes sobre un archivo que se llama "mensajes.txt", entonces veamos una pequeña linea de acciones:
- 1. Juanita entra a tu sitio y decide dejar un mensaje.
- 2. Pepé entra al sitio y se dirije a leer los mensajes dejados.
- 3. Junita escribe el mensaje y manda el post.
- 4. Pepé cliquea sobre la liga de "Leer Mensajes".
- 5. El script abre el archivo para escirbirlo, mientras también se abre para leerlo.
- 6. Resultado: Archivo Corrupto!
Si un archivo es accesado al mismo tiempo para realizar dos acciones diferentes, puede ocasionar ya sea que se corrompa el archivo o información incompleta.
Para evitar esto perl tiene implementada la función flock().
Tipos de flock()
Hay distintos tipos de flock() pero esta vez vamos a ver sólo dos, que creó que son los mas utilizados.
flock(IDENTIFICADOR_ARCHIVO,1); #bloquea el archivo para que solo pueda ser leído
flock(IDENTIFICADOR_ARCHIVO,2); #bloquea el archivo por completo
Como vemos usaríamos el primer flock() en caso de que sólo estemos leyendo el archivo para evitar que se intente modificarlo mientras tanto, por ejemplo:
open(FILE, "mensajes.txt");
flock(FILE,1);
my @mensajes = <FILE>;
close(FILE);
En el segundo caso bloquea el archivo por completo para evitar que se lea o se modifique mientras se esta utilizando:
open(FILE, ">>mensajes.txt");
flock(FILE,2);
print FILE "milinea\n";
close(FILE);
Conclusiones
Ya vimos como bloquear nuestros archivos cuando los estamos utilizando, de esta manera podemos evitar tener archivos corruptos o recibir mala información.
Si estamos haciendo código para Windows como para UNIX podríamos incluir una variable para preguntar cual es el sistema operativo:
my $os = "windows";
Ya de esa manera podemos aumentar en nuestras lineas de flock() lo siguiente:
flock(IDENTIFICADOR,1) if $os !~ /windows/i;