[Perl] Para no usar el flock();
Salvador Ortiz Garcia
sog@msg.com.mx
14 Jan 2003 02:53:03 -0600
On Tue, 2003-01-14 at 01:37, Alejandro G. Bedoya wrote:
> Saludos!!!
>
> En cierta ocasión vimos que no es muy seguro el flock de perl, ya que si
> entre el fileopen y el flock se pasa a otro proceso truena el archivo.
>
Opps! cómo que truena el archivo? el flock de perl es tan seguro como el
flock de C, pues en realidad es el mismo.
Ahora que pueden haber errores en la lógica del programa por ejemplo
suponer que entre el open y el flock o entre dos flocks el tamaño o
contenido del archivo no cambia; o uso inadecuado por ejemplo usar stdio
(con buffers) para el acceso a esos archivos.
> Alguien tendrá un código de ejemplo de como usar locking de archivos por
> medio de "Archivo tipo bandera" o algo similar??? Sugerencias???
>
Estos se usan para serializar el acceso a algún recurso (puerto,
archivo, etc), sale ejemplo simplista (le faltan por ejemplo 'signal
handlers'):
use POSIX qw(:errno_h :fcntl_h);
until(sysopen(FILE,'archivo.LCK',O_CREAT|O_EXCL)) { # Error
if($! == EEXIST) { # Tengo que esperar pues existe
sleep(5); # Me duermo un ratito
next;
}
# Errores de otro tipo
die "Can't open archivo.LCK: $!\n";
}
# Podría guardar mi PID en el archivo, etc
close(FILE);
# Ahora tengo el recurso para mi!
...
# Terminé, lo libero.
unlink('archivo.LCK');
# Otros ya lo pueden usar
> Gracias!
No hay de que!
Saludos.
--
Salvador Ortiz Garcia <sog@msg.com.mx>
Matías Software Group