OVH Cloud OVH Cloud

flock: retarder la lecture d'un fichier

3 réponses
Avatar
Julien Sobrier
Bonjour
Plusieurs programmes accedent en ecriture a un meme fichier. Je me
demande comment fare "attendre" chaque programe que le fichier soit
delocke pour pouvoir ecrire dedans. J'imagine qu'il y aune facon
standard de le faire, mais je n'ai pas trouve. Il y a la fnction
flock(2) pour locker le fichier, mais comment verifier que le fichier
est locke ou non, et dans le cas ou il est locke, comment attendre?

Merci
Julien

3 réponses

Avatar
root
On Mon, 17 Nov 2003 11:20:47 -0800, Julien Sobrier wrote:

Bonjour
Plusieurs programmes accedent en ecriture a un meme fichier. Je me
demande comment fare "attendre" chaque programe que le fichier soit
delocke pour pouvoir ecrire dedans. J'imagine qu'il y aune facon
standard de le faire, mais je n'ai pas trouve. Il y a la fnction
flock(2) pour locker le fichier, mais comment verifier que le fichier
est locke ou non, et dans le cas ou il est locke, comment attendre?



L'appel a flock() avec le paramètre LOCK_SH ou LOCK_EX est bloquant, donc
tant que le fichier est « locké » tu attendras automatiquement dans
flock() le temps qu'il soit « dé-locké »

L'appel avec LOCK_SH|LOCK_NB ou LOCK_EX|LOCK_NB est non bloquant et dans
ce cas flock() retourne « false » dans le cas ou le fichier est déjà
« locké » sinon il retourne « true ». Dans ce cas c'est à toi de
retenter un flock() avec par exemple une boucle while et un
sleep : `sleep 1 while(!flock(...));'

Voir `perldoc -f flock'

Note: ce « lock » n'est valable que si tous les programmes qui accedent
au fichier utilisent flock(). Cela n'empechera pas un programme tier de
modifier/effacer le fichier.

Avatar
dominix
Julien Sobrier wrote:
Bonjour
Plusieurs programmes accedent en ecriture a un meme fichier. Je me
demande comment fare "attendre" chaque programe que le fichier soit
delocke pour pouvoir ecrire dedans. J'imagine qu'il y aune facon
standard de le faire, mais je n'ai pas trouve. Il y a la fnction
flock(2) pour locker le fichier, mais comment verifier que le fichier
est locke ou non, et dans le cas ou il est locke, comment attendre?

Merci
Julien


la magie de perl c'est sa documentation
perldoc -f flock

flock FILEHANDLE,OPERATION
OPERATION is one of LOCK_SH, LOCK_EX, or LOCK_UN ...

il y a meme un exemple

pour aller plus loin il y a
perldoc perlopentut
ou en ligne
http://www.perldoc.com/perl5.8.0/pod/perlopentut.html#File-Locking

un conseil simple: utilise $|=1;

--
dominix

Avatar
Michel Rodriguez
Julien Sobrier wrote:

Plusieurs programmes accedent en ecriture a un meme fichier. Je me
demande comment fare "attendre" chaque programe que le fichier soit
delocke pour pouvoir ecrire dedans. J'imagine qu'il y aune facon
standard de le faire, mais je n'ai pas trouve. Il y a la fnction
flock(2) pour locker le fichier, mais comment verifier que le fichier
est locke ou non, et dans le cas ou il est locke, comment attendre?



perldoc -q lock

donne quelques elements de reponse, sinon un bon article sur pelmonks:
http://perlmonks.org/index.pl?node_id139 le Perl Cookbook a quelques
recettes la dessus (chapitre 7, recettes 18, 24, 25), et bien sur CPAN a
LockFile::Simple et File::Lock (je ne les ai pas testes).

__
Michel Rodriguez
Perl & XML
http://www.xmltwig.com