Bonjour,


Je fais suite au fil Pipe en entrée et en sortie.

Il s'avère que le script utilisé fonctionne bien pour les entrées courtes, mais il y a un blocage dès que l'entrée devient volumineuse. Le code suivant permet de mettre en relief le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
use strict;
use warnings;
 
use File::Slurp;
use IPC::Open2;
 
#* Paramètres. *
my $nomsource = "source.php";
 
sub filtrecommande {
    my ($commande, $entree) = @_;
 
    #* Ouverture des descripteurs de fichiers. *
    my ($df_sortie, $df_entree);
    my $pid = open2($df_sortie, $df_entree, $commande);
 
    #* Envoie des données en entrée du filtre. *
    print $df_entree $entree;
    close $df_entree;
print STDERR "Balise 1.\n";
    waitpid($pid, 0);
print STDERR "Balise 2.\n";
 
    #* Récupération des données en sortie de filtre. *
    my $sortie;
    while ( my $ligne = <$df_sortie> ) {
        $sortie .= $ligne;
    }
    close $df_sortie;
 
    #* Terminaison. *
    return $sortie;
 
}
 
my $source = read_file($nomsource, binmode => ':utf8');
my $produit = filtrecommande('php', $source);
print STDERR "Produit : <<$produit>>\n";
Le script s'arrête, lorsque 'source.php' est volumineux, entre la balise 1 et la balise 2. Manifestement le fils (qui lance le programme 'php' je pense) ne termine pas. Mon analyse est que le tampon de sortie du programme 'php' est plein.

Est-ce que quelqu'un aurait des idées, et pourrait me conseiller sur un mode de résolution ?