Integridad de ficheros
Jose Ignacio
jopinet@writeme.com
Wed, 04 Mar 1998 19:42:44 +0100
Hola, utilizando los consejos de Salvador (Muchas gracias) he intentado
probar con flock
pero tengo problemas
No se si es que al utilizar flock no se puede luego escribir el fichero
por entero abriendolo
con open (FF , '>loquesea.dat')
Además si evito el desbloqueo del fichero abro otra sesión y si me deja
escribir
A continuación pongo el trozo de programa tal como lo tengo a ve si me
iluminais ;-))
Las pruebas las hago sobre NT, con IIS y luego sobre UNIX con Apache
Saludos
Jose Ignacio
#!/bin/perl
$in = $ENV{QUERY_STRING};
$LOCK_SH = 1; #compartido solo leer
$LOCK_EX = 2; #nadie puede tocar el fichero
$LOCK_NB = 4;
$LOCK_UN = 8; #desbloqueo
use FileHandle;
open(FF,'+<eventos3.dat'); # Asi no me escribeeee o tengo que hacer algo
más porque luego
#en el print FF loquesea no me coge nada
FF->autoflush(1); # Para evitar líos con buffers, (aunque
me da error)
flock(FF,LOCK_EX); # Nadie puede tocar el fichero, (pues a mi no me
funciona)
while (<FF>) {
chop($primf=$_);
chop($numf=<FF>);
if ($primf eq $in) {
++$numf;
}
push (@kk, "$primf\n");
push (@kk, "$numf\n");
}
for ($i=0;$i<=$#kk;$i++) {
print FF "$kk[$i]";
}
close FF;
flock(FF,LOCK_UN); # Libere o no el fichero me escribe igual desde
#cualquier parte
*************************************************************
Salvador Ortiz Garcia escribió:
>
> 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.