/ 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
open, flock og dup
Fra : Morten Guldager


Dato : 04-10-07 15:09

Hejsa,

Mine programmer bruger gerne flock til at sikre sig imod at blive startet
mere end en gang.

Jeg plejer at starte programmet cirka sådan her:

my $fh = new FileHandle ">>$f" or die "FileHandle::new: $!";
die "STOP\n" unless flock($fh, LOCK_EX|LOCK_NB);

Det er jo lidt tosset at lave en append (>>) men en det er den
eneste måde jeg kan få den til at oprette filen hvis den ikke findes og
samtidig ikke sletter og genoprette hvis den allerede var det (hvilket
jo vil ødelægge en e.v.t. tidligere instans' lås)

Jeg har prøvet med >+ og lign. alverdens varianter, men har ikke rigtig
fundet noget der virker.

Forslag?

Nu vil jeg så også gerne exec'e et eksternt program hvor jeg bruger min
åbne låsefil som STDIN. Her må jeg skulle have gang i en dup. Men jeg har
ikke lige kunnet gennemskue en brugbar syntax.

Forslag?

Nå ja, det hele foregår på en nogenlunde moderne Linux kasse.


/Morten

 
 
Christian Laursen (04-10-2007)
Kommentar
Fra : Christian Laursen


Dato : 04-10-07 21:22

Morten Guldager <Morten.Guldager@gmail.com> writes:

> Det er jo lidt tosset at lave en append (>>) men en det er den
> eneste måde jeg kan få den til at oprette filen hvis den ikke findes og
> samtidig ikke sletter og genoprette hvis den allerede var det (hvilket
> jo vil ødelægge en e.v.t. tidligere instans' lås)

Hvis du åbner filen som alm. writable (>), bliver den godt nok
trunkeret, men en eksisterende lås fra en anden proces vil fortsat
være der.

> Jeg har prøvet med >+ og lign. alverdens varianter, men har ikke rigtig
> fundet noget der virker.
>
> Forslag?
>
> Nu vil jeg så også gerne exec'e et eksternt program hvor jeg bruger min
> åbne låsefil som STDIN. Her må jeg skulle have gang i en dup. Men jeg har
> ikke lige kunnet gennemskue en brugbar syntax.

Jeg kan ikke lige gennemskue, hvad du forsøger at opnå med det. For at
det skal give mening, skal der vel stå noget i filen, og den skal være
åben for læsning.

Før dit exec-kald burde det vel blot at være noget i den her stil:

dup2(fileno($fh), fileno(STDIN));

--
Christian Laursen

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

Månedens bedste
Årets bedste
Sidste års bedste