OVH Cloud OVH Cloud

Ecriture dans une FIFO

1 réponse
Avatar
Yves Martin
> > Je cherche à écrire un producteur de contenu dans un fichier FIFO:
> > mkfifo decision
> >
> > #!/usr/bin/perl -Tw
> >
> > use FileHandle;
> >
> > my $fh = new FileHandle("decision", "w");
> >
> > sub value {
> > print "Evaluation !\n";
> > return 5;
> > }
> >
> > while (1) {
> > $fh->print(&value() . "\n\004");
> > }
> >
> > Lorsque je lance le processus, et que je fais 'cat decision', je m'attends
> > à ce qu'une seule ligne sorte et que 'cat' termine sur EOF (\004 mais
> > c'est peut-être une erreur ?).
> >
> > Actuellement ce code boucle à l'infini, 'cat' ne se termine jamais.

> Oui, \04 n'est le charactere d'eof que pour un terminal (a moins
> qu'on ne le change par un stty eof 'autre-character').
>
> Il faut fermer le handle coté perl pour que cat voie un eof.

C'est ce que j'ai fait mais ce n'est visiblement pas suffisant.

#!/usr/bin/perl -Tw

use FileHandle;

my $fh = new FileHandle();

while (1) {
$fh->open("decision", "w");
$fh->print("5\n");
$fh->close();
## sleep(1);
}

Maintenant cela donne un nombre de lignes aléatoires dans 'cat' !!!

yma ~/perl> cat decision | wc
286 286 572
yma ~/perl> cat decision | wc
461 461 922
yma ~/perl> cat decision | wc
127 127 254
yma ~/perl> cat decision | wc
143 143 286

En rajoutant 'sleep(1)', le résultat est juste mais ce n'est pas la réactivité
à laquelle je m'attendais... Est-ce que l'on peut mieux faire ? Et comment ?

Je pense à:
- un sleep qui serait de qq microsecondes ?
- un flush avant le close ?
- forcer le changement de contexte après le close ?

Merci pour votre aide
--
Yves Martin

1 réponse

Avatar
DominiX
ici même:Yves Martin a écrit
Je cherche à écrire un producteur de contenu dans un fichier FIFO:
mkfifo decision

#!/usr/bin/perl -Tw

use FileHandle;

my $fh = new FileHandle("decision", "w");

sub value {
print "Evaluation !n";
return 5;
}

while (1) {
$fh->print(&value() . "n04");
}





ca va t'il mieux en activant autoflush ?

use FileHandle;
$|++;

...

-- dominix