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.