Blocage lecture fichier sous linux?
Le
Arnaud
Bonjour à tous,
Voilà j'ai un petit script dont le but est de faire de la recherche de
motifs ds les fichiers. Sous windows XP & 2000 pro cela fonctionne
correctement par contre sous linux, cela bloque sur certains fichiers comme
les /dev-console Je pense qu'il s'agit d'un problème d'accès concurrent
et que ma demande est mise en attente jusqu'à libération du blocage qui au
regard du fichier n'aura jamais lieu.
Ce que je ne comprends pas c'est que je teste si le fichier est ouvrable en
lecture avant de l'ouvrir :
if (not (-r $fichier)) {warn "Lecture de $fichier impossible"; return;}
if (-d $fichier) {return;}
open FIC, "<$fichier";
Quel est le problème ? Existe t il un moyen de savoir si un fichier est
locké (j'ai bien lu la doc sur flock qui dit comment locker un fichier mais
je n'ai rien trouvé pour tester si un fichier est locké), est il aussi
possible de définir un temps maximum d'attente pour l'ouverture d'un fichier
?
Merci d'avance c'est assez urgent !
Arnaud.
Voilà j'ai un petit script dont le but est de faire de la recherche de
motifs ds les fichiers. Sous windows XP & 2000 pro cela fonctionne
correctement par contre sous linux, cela bloque sur certains fichiers comme
les /dev-console Je pense qu'il s'agit d'un problème d'accès concurrent
et que ma demande est mise en attente jusqu'à libération du blocage qui au
regard du fichier n'aura jamais lieu.
Ce que je ne comprends pas c'est que je teste si le fichier est ouvrable en
lecture avant de l'ouvrir :
if (not (-r $fichier)) {warn "Lecture de $fichier impossible"; return;}
if (-d $fichier) {return;}
open FIC, "<$fichier";
Quel est le problème ? Existe t il un moyen de savoir si un fichier est
locké (j'ai bien lu la doc sur flock qui dit comment locker un fichier mais
je n'ai rien trouvé pour tester si un fichier est locké), est il aussi
possible de définir un temps maximum d'attente pour l'ouverture d'un fichier
?
Merci d'avance c'est assez urgent !
Arnaud.

Poser une question


Est-ce que tu as essaye
open( FIC, "<$fichier") or die "probleme sur open $fichier: $!"
AU moins ca te donnera exactement le probleme, plutot que tu essayes de
le deviner.
--
Michel Rodriguez
Perl & XML
http://www.xmltwig.com
Le problème est que les fichiers de /dev ne sont pas vraiment des
fichiers... ce sont des fichiers qui permettent de « dialoguer » avec le
kernel/drivers du kernel.
Dans ton cas il faut simplement tester si le fichier est « vraiment un
fichier » avec le test `-f' avant d'ouvrir ton fichier :
# teste si le fichier existe et est un fichier « standard »
if( not -f $fichier ) {
print "$fichier n'est pas un fichier standard !n";
return;
}
# teste si accessible en lecture
if( not -r $fichier ) {
print "Lecture de $fichier impossible";
return;
}
# on ouvre et on regarde s'il n'y a pas d'erreur...
if( not open FIC, "<", $fichier ) {
print "Erreur ouverture de $fichier : $!n";
return;
}
Ton blocage n'a rien a voir avec les « lock » (flock, etc.).
C'est juste que ce genre de fichier n'est pas un fichier « standard »
et n'a, la plupart du temps, pas de fin.
En gros, lorsqu'une application ouvre /dev/console, elle peut y lire ce
qui est tapé au clavier, en quelque sorte elle capture ce qui est tapé
au clavier, de plus une opération de lecture sur ce fichier est
bloquante, et ne retournera que lorsqu'il y aura des données tapé sur
le clavier, d'ou le fait qu'il n'y a pas de fin, d'ou le blocage.
Il y d'autres fichiers dans ce genre, comme /dev/dsp pour le son. Une
ouverture et une lecture de /dev/dsp permet de demander au kernel de
commencer l'échantillonnage sur la carte son et de transmettre les
données échantillonnés lorsque tu feras un read() sur ce descripteur de
fichier. Idem pour l'écriture et donc jouer un son. Ces fichiers
supportent en plus les ioctl (man ioctl) pour paramétrer le périphérique
et par exemple changer la fréquence d'échantillonnage de la carte son.
Sans le test `-f' tu peux aussi tomber sur le problème des `pipe'
(man mkfifo) qui sont des tuyaux bloquants. Une fois qu'il sont ouvert en
lecture, une opération de lecture sera bloqué jusqu'à ce qu'il y ait des
données écrites par quelqu'un d'autres sur ce même pipe.
Ca marche tip top !!!
Arnaud.
"root" news: