[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