Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2860 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Flush ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Flush ...

n°785153
alcante
Posté le 02-07-2004 à 16:48:31  profilanswer
 

Bonjour !
 
J'ai un leger probleme, je m'explique.
 
J'ai un script perl qui commence a etre consequent. J'ecrit tout au cours de l'execution du script dans divers fichiers de LOG ainsi que dans un fichier report ecrit en html.
 
Je souhaite que l'ecriture dans ce fichier soit non bufferiser. J'ai verifier dans la documentation perl ou j'ai pu lire qu'il suffit d'activer  l'autoflush sur le descripteur de fichier.
 
J'ai donc un descripteur LOG et j'utilise :
select LOG; $| =1;
 
et rien a faire. tout s'ecrit uniquement lorsque le script est stoppe.
 
Une idee ?
 
( apparemment $| devrait etre a 0 par defaut, ce qui n'est pas le cas chez moi .., source : http://www.bribes.org/perl/docfr/p [...] #LFFBFBDDA )

mood
Publicité
Posté le 02-07-2004 à 16:48:31  profilanswer
 

n°785323
pospos
Posté le 02-07-2004 à 21:27:18  profilanswer
 

meme si tu met l'autofluch ya tout de meme une petite bufferisation du system, mais pas grand chose normalement...
 
pour mettre un fd en autoflush tu dois faire comme ca:

Code :
  1. my $old_fd = select(LOG);
  2. $|=1;
  3. select($old_fd);


ou en une ligne (et sans variable temporaire):

Code :
  1. select((select(LOG), $| = 1))[0]);


 
et normalement ca marche...

n°785954
matafan
Posté le 04-07-2004 à 02:15:03  profilanswer
 

Ce n'est pas parce que ce n'est pas bufferisé au niveau de Perl que ce n'est pas bufferisé plus bas. Tout n'est pas écrit physiquement sur le disque dés que tu écris dans un fichier.

n°786390
alcante
Posté le 04-07-2004 à 20:39:24  profilanswer
 

tout d'abord merci pour vos réponses.
 
pospos > ce que tu a ecrit correspond a ce que j'ai dis. juste que tu reselectionne le descripteur précédent :)
 
matafan > ok, n'y a t'il donc pas de moyen d'écrire physiquement a chaque acces, ou de déclencher l'écriture physique a certain moment ?
 
Merci !

n°786463
pospos
Posté le 04-07-2004 à 22:31:50  profilanswer
 

oui effectivement ton truc devrait marcher aussi, mais si tu ne reselectionne pas ton fd par defaut (STDOUT) tu risque qq problemes.
essai de voir combien de donners doivent etre ecrite avant que ca flush pour de bon.
Il me semble qu'on peut desactiver le cache de l'OS (mais c'est pas ideal poru els perfs...) mais il restera celui du disque dur (qu'on peut d'ailleurs peut etre aussi desactiver? je sais pas).
enfin bon j'ai jamais eu ce genre de prob. Il fait combien de cache de ton disque dur?

n°786603
alcante
Posté le 05-07-2004 à 08:26:09  profilanswer
 

Je ne connais pas les details techniques precisement. Je tourne sous Solaris (SunBlade).
 
Je reselectionne evidemment STDOUT par la suite :)
( select (STDOUT); )
 
vraiment, c'est exasperant...

n°786691
pospos
Posté le 05-07-2004 à 10:54:50  profilanswer
 

essai peut etre un truc genre truncate à la taille actuelle du fichier, ou peut etre un syseek, et ca fera peut etre fulsher l'OS

n°819628
pospos
Posté le 10-08-2004 à 22:32:05  profilanswer
 

si tu as toujorus le probleme, tu peux tenter ca:
 
use IO::Handle;
IO::Handle::sync(LOG);
 
ca fait un fsync


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Flush ...

 

Sujets relatifs
Faire un flush en C++[PHP] Header et ob_flush
Flux : stringstream, à quoi sert le flush()[C++] istream & flush
Plus de sujets relatifs à : Flush ...


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)