/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
problemer i open() eller close()
Fra : Flemming Pedersen


Dato : 23-10-01 13:04

Jeg har et perl script hvor jeg læser fra og skriver til en html fil udfra
indtastede værdier. Jeg har et problm og jeg har isoleret problemet i
open(). Det mærkelige er bare at problemet ikke opstår hvergang. men ca hver
halve time. Problemet sker ikke hvis kun en bruger taster værdier, men hvis
der er flre der gør det så opstår problemet efter et stykke tid. Jeg bruger
flock() . En af mine subrutiner ku' se sådan ud:

use Fcntl ':flock'; # import LOCK_* constants

open(FILE, "<$root/file.html");
flock(FILE,LOCK_EX);
@variable = <FILE>;
flock(FILE,LOCK_UN);
close(FILE);

Ser de erfarede noget galt her? Eller noget der kan foråresage noget fejl
efter et stykke tid? Jeg fandt ud af at filen ikke kan læses, eller rettere
sagt værdien af @variable bliver tom. Hvad kan forhindre den i at få
indholdet af html filen? Bruger jeg måske flock() forkert?



 
 
Lars Balker Rasmusse~ (23-10-2001)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 23-10-01 13:32

"Flemming Pedersen" <fatih@ofir.dk> writes:
> use Fcntl ':flock'; # import LOCK_* constants
>
> open(FILE, "<$root/file.html");
> flock(FILE,LOCK_EX);
> @variable = <FILE>;
> flock(FILE,LOCK_UN);
> close(FILE);
>
> Ser de erfarede noget galt her?

Ja.

open FILE, "<$root/file.html" or die "open $root/file.html: $!";

ALTID teste returværdien af systemfunktioner!
--
Lars Balker Rasmussen "Special is bad."

Flemming Pedersen (23-10-2001)
Kommentar
Fra : Flemming Pedersen


Dato : 23-10-01 21:29


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fitd6k05z.fsf@humulus.daimi.au.dk...
> "Flemming Pedersen" <fatih@ofir.dk> writes:
> > use Fcntl ':flock'; # import LOCK_* constants
> >
> > open(FILE, "<$root/file.html");
> > flock(FILE,LOCK_EX);
> > @variable = <FILE>;
> > flock(FILE,LOCK_UN);
> > close(FILE);
> >
> > Ser de erfarede noget galt her?
>
> Ja.
>
> open FILE, "<$root/file.html" or die "open $root/file.html: $!";
>
> ALTID teste returværdien af systemfunktioner!


Jeg har nok glemt at tilføje min "||die "sætning, men det er heller ikke
proglemet.. I alle steder jeg har open () har jeg også || die()... men
problemet opstår ikke hvergang. Jeg mener ikke efter hver kørsel af
programmet, men me nogle næsten jævne mellemrum..



Lasse Hillerøe Peter~ (24-10-2001)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 24-10-01 08:14

In article <9r4k4r$1oqa$1@news.cybercity.dk>, "Flemming Pedersen"
<fatih@ofir.dk> wrote:

>Jeg har nok glemt at tilføje min "||die "sætning, men det er heller ikke
>proglemet.. I alle steder jeg har open () har jeg også || die()... men
>problemet opstår ikke hvergang. Jeg mener ikke efter hver kørsel af
>programmet, men me nogle næsten jævne mellemrum..

Og hvordan låser du, når du *skriver* til filen? (Hvilket er umåde meget
mere interessant end når du læser fra den.)

-Lasse

Christian Hemmingsen (24-10-2001)
Kommentar
Fra : Christian Hemmingsen


Dato : 24-10-01 09:12

lhp+news@toft-hp.dk (Lasse Hillerøe Petersen) writes:

> In article <9r4k4r$1oqa$1@news.cybercity.dk>, "Flemming Pedersen"
> <fatih@ofir.dk> wrote:
>
> >Jeg har nok glemt at tilføje min "||die "sætning, men det er heller ikke
> >proglemet.. I alle steder jeg har open () har jeg også || die()... men
> >problemet opstår ikke hvergang. Jeg mener ikke efter hver kørsel af
> >programmet, men me nogle næsten jævne mellemrum..
>
> Og hvordan låser du, når du *skriver* til filen? (Hvilket er umåde meget
> mere interessant end når du læser fra den.)

Husk at det kun er en "advisory" lock. Enhver der ellers har adgang
til at skrive til filen kan blæse på din lock og gøre det alligevel.

--
Christian Hemmingsen

Zamme Röha (23-10-2001)
Kommentar
Fra : Zamme Röha


Dato : 23-10-01 22:08

On Tue, 23 Oct 2001 14:04:05 +0200, Flemming Pedersen wrote:
> Jeg har et perl script hvor jeg læser fra og skriver til en html fil udfra
> indtastede værdier. Jeg har et problm og jeg har isoleret problemet i
> open(). Det mærkelige er bare at problemet ikke opstår hvergang. men ca hver
> halve time. Problemet sker ikke hvis kun en bruger taster værdier, men hvis
> der er flre der gør det så opstår problemet efter et stykke tid. Jeg bruger
> flock() . En af mine subrutiner ku' se sådan ud:
>
> use Fcntl ':flock'; # import LOCK_* constants
>
> open(FILE, "<$root/file.html");
> flock(FILE,LOCK_EX);
> @variable = <FILE>;
> flock(FILE,LOCK_UN);
> close(FILE);
>
> Ser de erfarede noget galt her? Eller noget der kan foråresage noget fejl
> efter et stykke tid? Jeg fandt ud af at filen ikke kan læses, eller rettere
> sagt værdien af @variable bliver tom. Hvad kan forhindre den i at få
> indholdet af html filen? Bruger jeg måske flock() forkert?
>
>

Så vidt jeg ved er der ingen grund til at requeste en exclusive lock når du
bare skal læse. Så det burde i overstående eksempel bare være en LOCK_SH. Når
du skal skrive derimod, så skal du have en exclusive lock.

For at debugge, tror jeg at jeg ville teste på returværdien af flock...f.eks.

print STDERR "Fejl: $errno" if flock(FILE,LOCK_EX);

Jeg tror at den exlusive lock fejler pga. samtidigheden, men det vil debug
linjen vise. Hvis det er tilfældet må du lave noget ala..

while (flock(FILE,LOCK_EX)) sleep 1;

for at tvinge låsen igennem..... Men kun ved skrivning. Dette er dog en
anelse grimt, med en potentiel uendelig løkke så derfor må du have en extra
variable på, ala.

while (flock(FILE,LOCK_EX) && ++$sleepCount<10) sleep 1;

Dette er alt sammen ad hoc og aldeles utestet, men burde give dig lidt
for at kunne komme videre.

....iøvrigt: || die bla bla.., men det ved du jo alt om.

--
Zamme Röha, Sældomptør og søløve

Red verdens sæler.

Adam Sjøgren (24-10-2001)
Kommentar
Fra : Adam Sjøgren


Dato : 24-10-01 18:15

On 23 Oct 2001 21:07:46 GMT, Zamme Röha wrote:

> Jeg tror at den exlusive lock fejler pga. samtidigheden, men det vil
> debug linjen vise. Hvis det er tilfældet må du lave noget ala..

> while (flock(FILE,LOCK_EX)) sleep 1;

Øh, flock blokerer. Fra perldoc -f flock:

"Two potentially non-obvious but traditional "flock" semantics are
that it waits indefinitely until the lock is granted, and that its
locks merely advisory."



Mvh.

--
"It's gonna be one of those underground pictures, right?" Adam Sjøgren
"No. It's gonna be all straight. On the up and up." asjo@koldfront.dk

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408915
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste