J'ai essayé de modéliser deux programmes, un qui écrit dans un pipe nommé et l'autre qui lit ce pipe.
Programme qui écrit
#!/usr/bin/perl -w
use strict ;
foreach my $i ( 'a' .. 'z' ) {
foreach my $j ( 1 .. 100 ) {
if ( ! open (PIPE, ">truc") ) {
die "$!:Impossible d'ouvrir le pipe" ;
}
print "Envoi $i $j\n" ;
print PIPE "$i $j\n" ;
close(PIPE) ;
select(undef, undef, undef, 0.1);
}
sleep 10 ;
}
Programme qui lit
#!/usr/bin/perl -w
use strict ;
if ( ! open (PIPE, "<truc") ) {
die "$!:Impossible d'ouvrir le pipe" ;
}
while (1) {
while (<PIPE>) {
my $lig = $_ ;
print "$lig" ;
}
}
J'ai interrompu et relancer plusieurs fois le programme de lecture, je n'ai pas de perte de données.
Celui qui écrit est bloqué en attendant qu'un nouveau lecteur soit lancé.
L'ouverture/fermeture du pipe à chque envoi est volontaire, car si une interruption du pipe arrive pendant l'écriture de plusieurs lignes, alors le programme reçoit du lecteur interrompu un signal. Perl sait évidemment gérer les signaux, mais c'est un peut plus difficile.
Je ne sais pas si cela répond à ton problème, mais essaie déjà avec ça.