Integridad de ficheros

Salvador Ortiz Garcia sog@msg.com.mx
Mon, 2 Mar 1998 19:02:34 -0600 (CST)


On Sun, 1 Mar 1998, Jose Ignacio wrote:

> Hola podríais ampliarme algo sobre el uso de "flock". He estado mirando
> el manual y lo usa despues de abrir un fichero con lo cual si ya estaba
> abierto el fichero el problema continua

Con gusto, vamomos por partes:
 
En 26 Feb 1998, Jose Ignacio escribiste:
 
  Mediante Perl controlo un fichero en el que escribo y leo muchisimas
  veces al día datos.

Y si entendí bien, necesitas controlar los accesos concurrentes a dicho
fichero ('archivo' en mexpañol).

  Para controlar los accesos al fichero utilizo la técnica de comprobar si
  existe un fichero de bloqueo, y si no existe lo creo y entonces abro el
  fichero para escritura. esto creo que está bien hecho pero me da
  problemas.

Lo que sugiero es que te olvides del fichero de bloqueo, y usando flock
controles los accesos al fichero principal.

Algo como:

Asumiendo LOCK_SH = 1, LOCK_EX = 2, LOCK_NB = 4 y LOCK_UN = 8

Para abrir el fichero:
  use FileHandle;
  ...
  open(DATOS,'+</ruta/a/mi/fichero'); # Nota +< para read/write
  DATOS->autoflush(1);                # Para evitar líos con buffers
  ... 

Para leer del fichero:
  ...
  flock(DATOS,LOCK_SH); # Lock compartido, cualquiera puede leer, pero
                        # no escribir.
  seek(DATO,0,$pos);    # Me muevo en el fichero a lo que quiero leer
  read(DATOS,$buff,$n); # Leo en $buff $n bytes.
  ...
  flock(DATOS,LOCK_UN); # Libero el fichero

Para escribir al fichero:
  
  flock(DATOS,LOCK_EX); # Nadie puede tocar el fichero
  seek(DATOS,0,$pos);   # Me muevo en el fichero a donde quiero escribir
  print DATOS $buf;     # Escribo $buff.
  flock(DATOS,LOCK_UN); # Libero el fichero


Depende de tu aplicación si se requieren las llamas a seek, las puse por
completés.

flock te proteje el fichero completo, si requieres un control más fino (a
nivel de registros) puedes usar fcntl(2).


Saludos.

Salvador Ortiz.